转载请注明出处:http://blog.csdn.net/a1dark
分析:经典的次短路问题、dijkstra或者SPFA都能做、先找出最短路、然后依次删掉没条边、为何正确就不证明了、了解思想直接A掉、注意记录路径
#include<stdio.h> #include<string.h> #define INF 0x7ffffff #define N 1010 int mpt[N][N]; int path[N]; int n,m; void init(){ for(int i=1;i<N;i++){ for(int j=1;j<N;j++){ if(i==j)mpt[i][j]=0; else mpt[i][j]=INF; } } } int dist[N]; void dij(){ int vis[N]; memset(path,-1,sizeof(path)); for(int i=1;i<=n;i++){ vis[i]=0; dist[i]=mpt[1][i]; } dist[1]=0; vis[1]=1; for(int i=1;i<n;i++){ int minx=INF; int w=0; for(int j=1;j<=n;j++){ if(vis[j]==0&&dist[j]<minx){ minx=dist[j]; w=j; } } vis[w]=1; for(int j=1;j<=n;j++){ if(vis[j]==0&&mpt[w][j]+dist[w]<dist[j]){ dist[j]=mpt[w][j]+dist[w]; path[j]=w; } } } } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ init(); for(int i=0;i<m;i++){ int s,t,v; scanf("%d%d%d",&s,&t,&v); if(v<mpt[s][t]){ mpt[s][t]=v; mpt[t][s]=v; } } dij(); int x=n; int dis[N]; dis[0]=n; int len=1; while(path[x]!=-1){ dis[len++]=path[x]; x=path[x]; } dis[len++]=1; int maxx=0; for(int i=0;i<len-1;i++){ int temp=mpt[dis[i]][dis[i+1]]; mpt[dis[i]][dis[i+1]]=INF; mpt[dis[i+1]][dis[i]]=INF; dij(); if(dist[n]>maxx) maxx=dist[n]; mpt[dis[i]][dis[i+1]]=temp; mpt[dis[i+1]][dis[i]]=temp; } printf("%d ",maxx); } return 0; }