题意:给你一个图,求删除一个点后使1->n的距离最大
思路:
枚举删除点,然后求最短路,取这些最短路的最大值
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <map> #include <vector> using namespace std; typedef long long ll; const int INF=0x3f3f3f3f; int n,m; int tmap[35][35]; int vis[50]; int dis[50]; void dijkstra(int x)//求最短路! { for(int j=1; j<=n; j++) { dis[j]=tmap[x][j]; } dis[x]=0; vis[x]=1; int tmin,k; for(int i=0; i<n; i++) { tmin=INF; for(int j=1; j<=n; j++) { if(!vis[j]&&dis[j]<tmin) { tmin=dis[j]; k=j; } } if(tmin==INF) break; vis[k]=1; for(int j=1; j<=n; j++) { if(!vis[j]&&dis[j]>dis[k]+tmap[k][j]) dis[j]=dis[k]+tmap[k][j]; } } } int main() { int u,v,len; while(scanf("%d%d",&n,&m) && (n||m)) { memset(tmap,INF,sizeof(tmap)); for(int i = 1; i <= m; i++) { scanf("%d%d%d",&u,&v,&len); if(tmap[u][v] > len) tmap[u][v] = tmap[v][u] = len; } int minx = 0; for(int i = 2; i < n; i++) { memset(vis,0,sizeof(vis)); vis[i] = 1; dijkstra(1); minx = max(minx,dis[n]); } if(minx == INF) printf("Inf "); else printf("%d ",minx); } }