P1186マリカがエッジを削除し、最長の最短経路を探す

トピックの意味:まとめると、最短経路のエッジを削除してから、最大の最短経路を見つける

アイデア:0.0

1 #include <bits / stdc ++。h>
 2  名前空間std を使用 3 const int inf = 0x3f3f3f3f ;
4 const int maxn = 1e3 + 10 ;
5 int vis [maxn]; int dis [maxn];
6 int cut [maxn] [maxn];
7 int match [maxn];
8 構造ノード
 9 {
 10 int v、w、nxt;
11 } G [ 1000010 ]; int head [maxn]; int num;
12               void add(int u、int v、int w)
 13  {
 14      G [++ num] .v = v; G [num] .w = w; G [num] .nxt = head [u]; head [u ] = num;
15  }
 16  void SPFA1()
 17  {
 18      queue < int > q;
19      memset(dis、inf、sizeof (dis));
20      memset(vis、0sizeof (vis));
21      q.push(1 );
22      vis [ 1 ] = 1 ;
23     dis [ 1 ] = 0 ;
24      while(!q.empty()){
 25          int u = q.front();
26          q.pop();
27          vis [u] = 0 ;
28          forint i = head [u]; i; i = G [i] .nxt){
 29              int v = G [i] .v、w = G [i] .w;
30              if(dis [v]> dis [u] + w){
 31                  dis [v] = dis [u] + w;
32                  match [v] = u;
33                  if(!vis [v]){
 34                     q.push(v);
35                      vis [v] = 1 ;
36                  }
 37              }
 38          }
 39      }
 40  }
 41  void SPFA2()
 42  {
 43      queue < int > q;
44      memset(dis、inf、sizeof (dis));
45      memset(vis、0sizeof (vis));
46      q.push(1 );
47      vis [ 1 ] = 1 ;
48      dis [ 1 ] = 0 ;
49      while(!q.empty()){
 50          int u = q.front();
51          q.pop();
52          vis [u] = 0 ;
53          forint i = head [u]; i; i = G [i] .nxt){
 54              int v = G [i] .v、w = G [i] .w;
55              場合(カット[U]は[V])続けます56              if(dis [v]> dis [u] + w){
 57                  dis [v] = dis [u] + w;
58                  if(!vis [v]){
59                      q.push(v);
60                      vis [v] = 1 ;
61                  }
 62              }
 63          }
 64      }
 65  }
 66  int main()
 67  {
 68      int n、m;
69      scanf(" %d%d "、&​​n、&m);
70      forint i = 1 ; i <= m; i ++ ){
 71          int u、v、w;
72          scanf(" %d%d%d "、&​​u、&v、&w);
73          add(u、v、w);
74          add(v、u、w);
75      }
 76      SPFA1();
77      int now = n;
78      int ans = dis [n];
79      while (match [now]){
 80          int u = now; int v = match [now];
81          カット[u] [v] =カット[v] [u] = 1 ;
82          SPFA2();
83          カット[u] [v] =カット[v] [u] = 0 ;
84          ans = max(ans、dis [n]);
85          今=match [now];
86      }
 87      printf(" %d \ n " 、ans);
88は     0を返し ます89 }
コードを表示

 

おすすめ

転載: www.cnblogs.com/pangbi/p/12722428.html