HDU-5137(最短路)

题目链接:传送门
分析:题目大概意思是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);
	 }
} 

猜你喜欢

转载自blog.csdn.net/weixin_43556295/article/details/87994515
今日推荐