题意不多说了。。思路就是先走一遍dijkstra,然后p数组记录下路径,然后枚举路径上的边删去之后走dijkstra得到的最短路(想想为什么?我当时做的时候是枚举了图每条边,然后就超时),取最大值。
#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <string> #include <vector> #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]<mini) { mini=dis[j]; flag=j; } } if(mini==INF) return; vis[flag]=true; for(j=1;j<=n;j++) { if(!vis[j] && map[flag][j]+dis[flag]<dis[j]) { dis[j]=map[flag][j]+dis[flag]; if(f) p[j]=flag; } } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { memset(p,0,sizeof(p)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { map[i][j]=INF; map[i][i]=0; } } for(int i=0;i<m;i++) { int u,v,l; scanf("%d%d%d",&u,&v,&l); if(map[u][v]>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 */
HDU1595(枚举+最短路(dijkstra)),布布扣,bubuko.com
原文:http://blog.csdn.net/mfmy_szw/article/details/21990367