E - Heavy Transportation POJ - 1797

在这里插入图片描述

在这里插入图片描述
题意:找一条路从 1 到 n , 这条路上的最小权值为这条路的权值,找一条路使权值最大。
题解:Dijkstra求最短路的修改,每次找距离 1 点边权最大的点,位置记录在pos上,每加入一个新点,更新dis , 进入更新的条件是,g[pos][j]>dis[j],在这之后好要保证dis[pos]>dis[j] , 不理解的话,结合题意画一个三角形。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
#define maxn 1115
const int inf = 0x3f3f3f3f;

int dis[maxn];
int g[maxn][maxn];
bool vis[maxn];
int n,m;

void Dijkstra(int n)
{
	memset(vis,0,sizeof(vis));
	for(int i = 1 ; i<= n ; i++)
	{
		dis[i] = g[1][i];
	}
	vis[1] = true;
	for(int i = 1 ; i < n ; i++)
	{
		int maxx = 0;
		int pos;
		for(int j = 1 ; j <= n ; j++)
		{
			if(dis[j]>maxx&&!vis[j])
			{
				pos = j;
				maxx = dis[j];
			}
		}
		vis[pos] = true;
		for(int j = 1 ; j<= n; j++)
		{
			if(dis[j]<g[pos][j])
			dis[j] = max(dis[j],min(dis[pos],g[pos][j]));
		}
	}
	return;
}

int main()
{
	int t,n,m;
	scanf("%d",&t);
	for(int l = 1 ; l <= t; l++)
	{
		scanf("%d%d",&n,&m);
		memset(g,0,sizeof(g));
		for(int i = 0 ; i <m ;i++)
		{
			int a,b,c;
			scanf("%d%d%d",&a,&b,&c);
			if(c>0)
			g[a][b] = g[b][a] = c;
		}
		Dijkstra(n);
		printf("Scenario #%d:\n",l);
		printf("%d\n\n",dis[n]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40240576/article/details/83153120