[KuangBin专题四]Heavy Transportation

Heavy Transportation

原题链接:传送门

题目大意

给定一个无向图,要求求出1 - n 的所有的最长路径中最短的那一条边的权值为多少。

分析

这题和POJ2253 相呼应,我们设(dis[x]) 表示 从 1 - x 所经过的边中最大值中的最小值为多少。

故在利用 x 点进行更新时:

(dis[y] = min(dis[y] , max(dis[x] , w)))

注意事项

  • 在使用求最大值最小的问题的中需要将dis数组置为0,并且初始化每个两个点之间的初始距离

AC 代码

C++ code

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>

using namespace std;

typedef long long ll;
const int N = 10005;
const int M = N * N;

struct edge{
	int w , to , next;
}e[M];

int head[N] , tot , vis[N] ,dis[N];
int n , m , test;
void add(int a,int b,int c)
{
	e[++tot].to = b;
	e[tot].w = c;
	e[tot].next = head[a];
	head[a] = tot;
}
void dijkstra(int s)
{
	memset(dis , 0 , sizeof dis);
	// 需要先预处起点到和其相连的点的距离
	for(int i = head[s] ;i != -1;i = e[i].next)
		dis[e[i].to] = e[i].w;
	memset(vis , 0 , sizeof vis);
	for(int j = 0;j < n ;j ++)
	{
		int x = -1;
		for(int i = 1;i <= n ;i ++)
		{
			if(!vis[i] && (x == -1 || dis[i] > dis[x]))x = i;
		}
		vis[x] = 1;
		for(int i = head[x] ; i != -1 ;i = e[i].next)
		{
			int y = e[i].to , w = e[i].w;
			dis[y] = max(dis[y] , min(w, dis[x]));
		}
	}
}
void slove()
{
	tot = 0;
	memset(head , -1 , sizeof head);
	cin >> n >> m;
	for(int i = 0;i < m ;i ++)
	{
		int a, b , c;
		cin >> a >> b >> c;
		add(a , b , c) , add(b , a , c);
	}
	dijkstra(1);
	printf("Scenario #%d:
%d

", test , dis[n]);
}
int main()
{
	int t;cin >> t;
	while(t--)
	{
		test++;
		slove();
	}
	return 0;
}
原文地址:https://www.cnblogs.com/wlw-x/p/13764958.html