C - Heavy Transportation dijkstra 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

题意就是让找,各个路径中最小的那条边的最大值

比如 3 ->5 和 4,第一条路径最小的是3,第二条路径最小的是4,那么4就是最小的之中最大的。

做法就是改改松弛操作,dist[j] = max(min(dist[u],a[u][j]));

还要注意的是这里的dist意义不再是1到某点的最短路径,而是到某个点的路径中的最小边的最大值,不难理解,但是要记得把之前代码中,求的也不是最小,而是取最大,还有在init时初始化是-INF.

#include"stdio.h"
#include"algorithm"
#include"cstring"
#include"iostream"
#define maxn 1005
#define INF 0x3f3f3f3f
using namespace std;

int n,m;
int a[maxn][maxn];

int dist[maxn];
int vst[maxn];
void init()
{
	for(int i = 1;i <= n;i ++)
	{
		for(int j = 1;j <= n;j ++)
		{
			if(i==j)
			{
				a[i][j] = 0;
			}
			else
			{
				a[i][j] = -INF;
				a[j][i]= -INF;
			}
		}
	}
	
}
void dijkstra()
{
	
	for (int i = 1; i <= n; i++) {
		dist[i] = a[1][i];
	}
	dist[1]=0;
	vst[1]=1;
	for(int i =  2;i <= n;i ++)
	{
		int u = -1,mxxx=-INF;
		for(int j = 1;j <= n;j ++)
		{
			if(vst[j] == 0 && dist[j] > mxxx)
			{
				u=j;
				mxxx=dist[j];
			}
		}
		vst[u]=1;
		for(int j = 1;j <= n;j ++)
		{
			if(vst[j] == 0)
			{
				int maxx = min(dist[u],a[u][j]);
				if(maxx > dist[j])
				{
					dist[j]=maxx;
				 } 
			} 
		}
	}
}

int main()
{
	int t;
	scanf("%d",&t);
	int h = 1;
	while(t--)
	{
		scanf("%d %d",&n,&m);
		int t1,t2,t3;
		memset(dist,INF,sizeof(dist));
		memset(vst,0,sizeof(vst));
		init(); 
		for(int i = 0;i < m;i ++)
		{
			scanf("%d %d %d",&t1,&t2,&t3);
			a[t1][t2]=t3;
			a[t2][t1]=t3;
			
			
		}
		
		dijkstra();
		printf("Scenario #%d:\n",h++);
		printf("%d\n\n",dist[n]);
	
	}
	return 0;
}
发布了58 篇原创文章 · 获赞 20 · 访问量 5230

猜你喜欢

转载自blog.csdn.net/qq_41658124/article/details/88900999