
题意:给你一个图,求删除一个点后使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\n");
else
printf("%d\n",minx);
}
}