链接:点击打开链接
题意:给定一个无向图,问去点2~N-1中的一个点后,从1到N的最小距离的最大值
代码:
#include <queue>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int n,m;
int d[35],vis[35];
struct node{
int to,val;
};
vector<node> G[35];
void spfa(int S,int T){
int i,u,v,w;
memset(d,INF,sizeof(d));
memset(vis,0,sizeof(vis));
vis[S]=1,d[S]=0;
queue<int> qu;
qu.push(S);
while(qu.size()){
u=qu.front();
qu.pop();
vis[u]=0;
for(i=0;i<G[u].size();i++){
v=G[u][i].to;
w=G[u][i].val;
if(v==T) //遇到去掉的点直接不更新
continue;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
if(vis[v]==0){
vis[v]=1;
qu.push(v);
}
}
}
}
}
int main(){
int i,j,u,v,w,ans;
while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){
for(i=1;i<=n;i++)
G[i].clear();
for(i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
G[u].push_back((node){v,w});
G[v].push_back((node){u,w});
}
ans=-1;
for(i=2;i<n;i++){ //直接枚举每个点跑spfa
spfa(1,i);
ans=max(ans,d[n]);
}
if(ans==INF)
puts("Inf");
else
printf("%d\n",ans);
}
return 0;
}