题意:从2~n-1这几个点中任意去掉一个点,使得从1到n的最短路径最大,如果任意去掉一个点1~n无通路输出Inf。
思路:枚举去掉2~n-1个点,依次用dijkstra算法求取最短路,去最大即可
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=510;
const int INF=0x3f3f3f3f;
int n,m;
int g[N][N],dist[N];//邻接矩阵,第i个点到起点的最短距离
bool st[N];//代表第i个点的最短距离是否确定
void dijkstra(){
memset(dist,0x3f,sizeof(dist));
for(int i=1;i<=n;i++){
dist[i]=g[1][i];
}
dist[1]=0;
for(int i=0;i<n;i++){
int t=-1;
for(int j=1;j<=n;j++){
//在没有确定的点中找到一个距离原点最近的点
if(!st[j]&&(t==-1||dist[t]>dist[j]))
t=j;
}
if(t==0||st[t]==1)
break;
st[t]=true;//t点已确定
for(int j=1;j<=n;j++){
dist[j]=min(dist[j],dist[t]+g[t][j]);
}
}
//if(dist[n]==0x3f3f3f3f)return -1;
// return dist[n];
}
signed main(){
while(cin>>n>>m&&n+m){
memset(g,0x3f,sizeof(g));
while(m--){
int a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
g[a][b]=min(g[a][b],c);
g[b][a]=g[a][b];
}
int k=0;
// cout<<m<<"*"<<endl;
for(int i=2;i<=n-1;i++){
memset(st,0,sizeof(st));
st[i]=1;
dijkstra();
// cout<<dijkstra()<<endl;
int h=dist[n];
// cout<<"k="<<k<<" "<<"h="<<h<<endl;
k=max(k,h);
}
if(k>=INF)cout<<"Inf\n";
else cout<<k<<endl;
}
return 0;
}