題意不多說了。。思路就是先走一遍dijkstra,然後p數組記錄下路徑,然後枚舉路徑上的邊刪去之後走dijkstra得到的最短路(想想為什麼?我當時做的時候是枚舉了圖每條邊,然後就超時),取最大值。
#include#include #include #include #include #include #define maxn 1005 #define INF 999999999 using namespace std; int n,m; int map[maxn][maxn]; int dis[maxn]; int vis[maxn]; int p[maxn]; void dijkstra(int f) { int i,j,mini,flag; for(i=1;i<=n;i++) dis[i]=INF; dis[1]=0; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) { mini=INF; for(j=1;j<=n;j++) { if(!vis[j] && dis[j] l) { map[u][v]=map[v][u]=l; } } dijkstra(1); int Max=dis[n]; for(int i=n;i!=1;i=p[i]) { int t=map[i][p[i]]; map[i][p[i]]=map[p[i]][i]=INF; dijkstra(0); Max=max(Max,dis[n]); map[i][p[i]]=map[p[i]][i]=t; } printf("%d\n",Max); } return 0; } /* 5 6 1 2 4 1 3 3 2 3 1 2 4 4 2 5 7 4 5 1 6 7 1 2 1 2 3 4 3 4 4 4 6 4 1 5 5 2 5 2 5 6 5 5 7 1 2 8 1 4 10 2 3 9 2 4 10 2 5 1 3 4 7 3 5 10 */