レイアウト
微分制約:
形如:$ x1-x2> = a、x1-x3> = b、x2-x3 <= c $
この公式を表示するには、微分制約と最短経路を使用する必要があります。$ x1とx3 $の最大差が必要な場合、最短パスが使用されます。すべての式は$ x1-x2 <= a $の形式に変換する必要があります。最小値が見つかった場合、最長パスが使用されます。すべての式が変換されます$ x1-x2> = a $の形式。作画に関しては、タイトルに応じてエッジの向きを決める必要があります。
元のタイトルリンク:http : //poj.org/problem?id=3169
主なアイデア:
1からnまでのn頭の牛で、シリアル番号に従って各牛が一直線に並んでいるので、複数の牛を同じ位置に配置できます。一部の牛は、好きな牛や嫌いな牛がいるため、お互いの距離が必要です。最初の牛とn番目の牛の間の最大距離。
問題解決のアイデア:
最大距離を見つけるには、最短経路を使用します。負の値がある場合、負のリングがある可能性があるため、spfaを使用します。キューに入れることができるかどうかを判断する必要があるため、スーパーソースポイントを構築し、すべての牛を接続し、すべてのエッジを通過させる必要があります。
コード:
1 #include <stdio.h> 2 #include < string .h> 3 #include <iostream> 4 #include <vector> 5 #include <queue> 6 名前空間std を使用 。 7 typedef long long ll; 8 #define debug(a)cout <<#a << ":" << a << endl; 9 const int INF = 0x3f3f3f3f ; 10 const int N = 1e6 + 7 ; 11 const int mod = 1e9 + 7 ; 12 整数 maxn、minn; 13 int T、n; 14 int u、v、w; 15 int dis [N]; 16 int vis [N]; 17 int cnt [N]; 18 struct aa { 19 int u、w; 20 } p; 21ベクトル<aa> mp [N]; 22 bool spfa(int a){ 23 memset(vis、0、sizeof (vis)); 24 memset(dis、INF、sizeof (dis)); 25 memset(cnt、0、sizeof(cnt)); 26 queue < int > que; 27 que.push(a); 28 dis [a] = 0 ; 29 while(!que.empty()){ 30 int a = que.front(); 31 vis [a] = 0 ; 32 que.pop(); 33 for(int i = 0 ; i <mp [a] .size(); i ++ ){ 34 p = mp [a] [i]; 35 if(dis [pu]> dis [a] + pw){ 36 dis [pu] = dis [a] + pw; 37 cnt [pu] = cnt [a] + 1 ; 38 if(cnt [pu]> = n){ 39 return true ; 40 } 41 if(vis [pu] == 0 ){ 42 que.push(pu); 43 vis [pu] = 1 ; 44 } 45 } 46 } 47 } 48は falseを返し ます。 49 } 50 int main(){ 51 intm1、m2; 52 cin >> n >> m1 >> m2; 53 for(int i = 1 ; i <= m1; i ++ ){ 54 cin >> u >> v >> w; 55 pu = v; 56 pw = w; 57 mp [u] .push_back(p); 58 } 59 for(int i = 1 ; i <= m2; i ++ ){ 60 cin >> u >> v >> w; 61 pw = -w; 62 pu = u; 63 mp [v] .push_back(p); 64 } 65 for(int i = 1 ; i <= n; i ++ ){ 66 pu = i; 67 pw = 1 ; 68 mp [ 0 ] .push_back(p); 69 } 70 if(spfa(0 )){ 71 puts(" -1 " ); 72 } 73 else { 74 spfa(1 ); 75 if(dis [n]> = INF / 2 ){ 76 puts(" -2 " ); 77 } 78 else { 79 printf(" %d \ n " 、dis [n]); 80 } 81 } 82 return 0 ; 83 }