题意:概括起来就是:删除任意最短路径上的边,然后求出最大的最短路
思路:0.0
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace 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 struct node 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 if(cut[u][v]) continue; 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 cut[u][v]=cut[v][u]=1; 82 SPFA2(); 83 cut[u][v]=cut[v][u]=0; 84 ans=max(ans,dis[n]); 85 now=match[now]; 86 } 87 printf("%d\n",ans); 88 return 0; 89 }