トピックの意味:まとめると、最短経路のエッジを削除してから、最大の最短経路を見つける
アイデア: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、0、sizeof (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 for(int 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、0、sizeof (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 for(int 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 for(int 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 }