羅区P4878 [USACO05DEC]レイアウト
説明
他の種と同じように、牛のようにも彼らの友人と一緒に入れたときにDafanをラインアップしたいです。FJは1頭の... N N牛(2≤N≤1000)が番号が付けられています。最初に、牛は番号順に並びます。牛は非常に不器用なので、同じ位置に牛があるかもしれません。
いくつかの牛は友達をベースとしている、彼らは特定の数よりも少ない互いに等しい距離を求めています。いくつかの牛のライバルは、彼らは互いの間の距離が数以上欲しいです
MLグループIDが良い友達に与えられ、そして別のはるかに少ない一方との間、それらの所望の距離であり、そしてMD番号ライバルの数が与えられ、それらはお互い(1≤ML、MD≤10から以上の距離を希望します4番目)
計算:上記のすべての条件が満たされる場合、N 1および牛最大数牛数との間の距離。
入力
最初の行:スペースで区切られた3つの整数N、ML、MD、。
2 ... ML +行の1:スペースで区切られた三つの整数各列A、B、D、数≤Dことが、牛の牛をAとBとの間の距離を表します。6、1≤D≤10のパワー1≤A<B≤Nを確実にするために
第ML + 2 ... ML + MD + 1行:三つの整数スペースで区切られた各列A、B、D、数≥Dことが、牛の牛をAとBとの間の距離を表します。6、1≤D≤10のパワー1≤A<B≤Nを確実にするために
出力
- ライン、整数。プログラムが有効でない場合、出力
-1
がある場合に正規のプログラム、第1号が、離れて無限と牛牛の数N、出力する-2
。そうでない場合、出力111頭の牛や乳牛番号NNN間の最大距離。
サンプル入力
4 2 1
1 3 10
2 4 20
2 3 3
サンプル出力
27
ソリューション:
- 微分制約。
- この問題は、私は、差動制約の新しい理解しているせます。
- その質問ならば2つの問題があります。1:解けるです。2:出力しない、無限大です最大距離
- 最初の質問のためにあなたの姿を鳴らすが、実際に存在するかどうかを尋ねることです。コネクティビティマップ、もちろん、接続されていない無限(無限に多くのソリューションが)、それは出力の最大距離と通信できるかどうかを2つ目の質問は、実際にあなたを求めています。
- リフレクション差動制約が前にしました。問題は2つの要素間の関係に特異的であることを除いて。今回は、スーパーソースを構築することはできません。あなたが通信していない場合ので、図のソースは、スーパー図の通信に追加されます。2つの要素間のこのような関係は、ほとんど元の状態ではありません。
- だから、もう一度差制約をまとめました。
- 観察は、質問が最大または最小のために努力することです頼みますか?
- 最大:不等式形態のX <= Yの+ cに統一。図構造:(Y、C、X)を加えます。最短ラン。
- 分:フォームの不等式X> = Yの+ cに統一。図構造:(Y、C、X)を加えます。彼は道を駆け上がりました。
- 観察面が求めている質問のどのタイプの質問ですか?
- 実現可能性:スーパーソースの確立は、リングを宣告しました。
- 一般答え:スーパーソースをビルドし、実行しspfa
- 狭い答え(二つの要素に固有):あなたはスーパーソースを構築することはできませんが、一点からspfaを走りました
- 観察は、質問が最大または最小のために努力することです頼みますか?
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define N 200005
using namespace std;
struct E {int next, to, dis;} e[N];
int n, m1, m2, num;
int h[N], dis[N], cnt[N];
bool vis[N];
int read()
{
int x = 0; char c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}
return x;
}
void add(int u, int v, int w)
{
e[++num].next = h[u];
e[num].to = v;
e[num].dis = w;
h[u] = num;
}
int spfa(int s)
{
queue<int> que;
memset(dis, 0x3f, sizeof(dis));
memset(vis, 0, sizeof(vis));
dis[s] = 0, vis[s] = 1, que.push(s);
while(!que.empty())
{
int now = que.front();
cnt[now]++;
if(cnt[now] >= n) return -1;
que.pop(); vis[now] = 0;
for(int i = h[now]; i != 0; i = e[i].next)
if(dis[now] + e[i].dis < dis[e[i].to])
{
dis[e[i].to] = dis[now] + e[i].dis;
if(!vis[e[i].to])
vis[e[i].to] = 1, que.push(e[i].to);
}
}
if(dis[n] - dis[1] == 0x3f3f3f3f) return -2;
else return dis[n] - dis[1];
}
int main()
{
cin >> n >> m1 >> m2;
for(int i = 1; i <= m1; i++)
{
int a = read(), b = read(), c = read();
add(a, b, c);
}
for(int i = 1; i <= m2; i++)
{
int a = read(), b = read(), c = read();
add(b, a, -c);
}
for(int i = 1; i <= n; i++) add(n + 1, i, 0);
if(spfa(n + 1) == -1) {cout << -1; return 0;}
else cout << spfa(1);
return 0;
}