题目链接:传送门
分析:题目大概意思是BOSS LIU的人脉圈互相帮忙但是要钱,你需要劝说一个人,让BossLIU没办法叫到校长或者花更多的钱。
思路:最短路,用spfa算法方便点,难点在于如何变通处理砍掉某个点能使最短路变最大。一开始总是不知道去掉什么点好,看了网上的题解,竟然是全部遍历一遍(因为数据小)。。。。
AC代码:
#include<cstdio> //头文件纯属模板
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
const int INF = 1000000000;
int tu[35][35]; //两点之间的权值
int dis[35];
bool used[35];
int n,m;
int spfa(int s,int qu){ //qu是指去掉的点
fill(dis,dis+n+1,INF);
queue<int> que;
dis[s]=0;
que.push(s);
used[s]=true;
while(!que.empty()){
int now=que.front();
que.pop();
used[now]=false;
for(int i=1;i<=n;i++){
if(i==qu) continue; //遇到时直接跳过
if(dis[i]>dis[now]+tu[now][i]){
dis[i]=dis[now]+tu[now][i];
if(!used[i]){
que.push(i);
used[i]=true;
}
}
}
}
return dis[n];
}
int main(){
while(cin>>n>>m){
if(n==0&&m==0) break;
memset(used,false,sizeof(used));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(i==j) tu[i][j]=tu[j][i]=0;
else tu[i][j]=tu[j][i]=INF;
}
for(int i=0;i<m;i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
tu[a][b]=tu[b][a]=c;
}
int ans=0,num;
for(int i=2;i<n;i++){ //遍历2--n-1的点
num=spfa(1,i);
ans=max(num,ans);
}
if(ans==INF) printf("Inf\n");
else printf("%d\n",ans);
}
}