Heavy Transportation POJ - 1797(最短路变形)

N个点,M条边,每条边有权值。求一条1号点到N号点的路径,要求使得路径中的边权最小值最大。

Input

多组输入,第一行给一个T
每一组第一行给两个数n和m。(1 <= n <= 1000)
接下来m行,每行三个数u,v,w代表路径的两个端点与边权。
(1 <= u,v <= n , 0< w <= 1e6)
保证两点间只有一条边,该图为无向图。

Output

第i组数据先输出 "Scenario #i:"
然后输出该路径上的最小边权。
保证有解

Sample Input

1
3 3
1 2 3
1 3 4
2 3 5

Sample Output

Scenario #1:
4

这道题目与 POJ 2253 差不多,很相像,就是与那道题目正好相反,这个是求最大的 最小边(每条通路都有一个最小边),具体的就不对说了,就很像最大生成树,就是全反过来。

代码:

#include<iostream>
#include<cstdio>
#include<math.h>
#include<algorithm>
#include<string.h>
typedef long long ll;
using namespace std;
const int maxn=1010;
const int inf = 0x3f3f3f3f;

int maap[maxn][maxn];
int vis[maxn];
int d[maxn];
int n,m;

void init()
{
	memset(vis,0,sizeof(vis));
	memset(d,0,sizeof(d));
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(i==j)
				maap[i][j]=0;
			else
				maap[i][j]=-inf;
	
}


int main()
{
	
	int t;
	scanf("%d",&t);
	int kase=0;
	while(t--)
	{
		scanf("%d%d",&n,&m);
		init();
		int a,b,val;
		for(int i=0;i<m;i++)
		{
			scanf("%d%d%d",&a,&b,&val);
			if(maap[a][b]<val)
			{
				maap[a][b]=maap[b][a]=val;
			}
		}
		for(int i=1;i<=n;i++)
			d[i]=maap[1][i];
		int pos;
		for(int i=0;i<=n;i++)
		{
			int minv=-inf;
			for(int j=1;j<=n;j++)
			{
				if(!vis[j]&&d[j]>minv)
				{
					pos=j;
					minv=d[j];
				}
			}
			vis[pos]=1;
			for(int j=1;j<=n;j++)
			{
				if(!vis[j])
				d[j]=max(d[j],min(d[pos],maap[pos][j]));
			}
			
		}
		
		printf("Scenario #%d:\n%d\n\n",++kase,d[n]);
		
	}
	
	return 0;
}

很好,这两个题目,多学习了。

发布了123 篇原创文章 · 获赞 83 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/tsam123/article/details/89684238