POJ1797-Heavy Transportation(最短路变形)

题目链接:传送门biubiubiu~~

分析:自己感觉有点奇妙,做了POJ2253-Frogger(最短路变形)这道题后,感觉莫名奇妙,这道题就扫了一遍代码就一遍过了。。(难道是传说中的题感还是这题有点水),感觉自己都没理解透就A过去了。。。 题意大概是,把承重量当两条路之间的权值,找到从起始点到终点的(各条路径中最小值的那段)中的最大值,即max(min(可行路径边)),然后只要套上模板然后把dis[ ]当作到达某点的可行路径最小值中最大的那个(有点绕口)就行了。。。
(对了,输入用cin会超时。。。)

AC代码:

#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
#include<cstdio>
using namespace std;
int n,m;
int map[1005][1005];
bool vis[1005];
int dis[1005];
const int INF=100000000;
void spfa(int s){
	memset(vis,false,sizeof(vis));
	for(int i=1;i<=n;i++)	dis[i]=0;//所有初始为0才能在松弛操作中被替代掉
	queue<int> que;
	vis[s]=true;
	dis[s]=INF;   //初始值要无穷大才能被代替掉,否则数据一直是0
	que.push(s);
	while(!que.empty()){
		int now=que.front();
		que.pop();
		vis[now]=false;
		for(int i=1;i<=n;i++){
			if(min(dis[now],map[now][i])>dis[i]){ //判断条件这里即为找出每条可行路径的最小值
				dis[i]=min(dis[now],map[now][i]);//同时是所有中最大的
				if(!vis[i]){
					que.push(i);
					vis[i]=true;
				}
			}
		}
	}
}
int main(){
	int t,ans=0;
	cin>>t;
	while(t--){
		cin>>n>>m;
		ans++;
		memset(map,0,sizeof(map));
		for(int i=1;i<=m;i++){
			int a,b,c;
			scanf("%d %d %d",&a,&b,&c);
			map[a][b]=map[b][a]=c;
		}
		spfa(1);
		cout<<"Scenario #"<<ans<<":"<<endl;
		cout<<dis[n]<<endl<<endl;
	}
}

猜你喜欢

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