POJ-3169レイアウト(差動制約)

レイアウト  

微分制約:

形如:$ 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、0sizeof (vis));
24      memset(dis、INF、sizeof (dis));
25      memset(cnt、0sizeof(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          forint 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      forint i = 1 ; i <= m1; i ++ ){
 54          cin >> u >> v >> w;
55          pu = v;
56          pw = w;
57          mp [u] .push_back(p);
58      }
 59      forint i = 1 ; i <= m2; i ++ ){
 60          cin >> u >> v >> w;
61          pw = -w;
62          pu = u;
63          mp [v] .push_back(p);
64      }
 65      forint 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 }

 

 

おすすめ

転載: www.cnblogs.com/meanttobe/p/12761323.html