[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:\n%d\n\n", test , dis[n]);
}
int main()
{
int t;cin >> t;
while(t--)
{
test++;
slove();
}
return 0;
}