【题目描述】
该市有
m
m
m条大道连接
n
n
n个区,一条大道将两个区相连接,每个大道有一个拥挤度。小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐。所以请你帮她规划一条从
s
s
s至
t
t
t的路线,使得经过道路的拥挤度最大值最小。
【输入格式】
第一行有四个用空格隔开的
n
,
m
,
s
,
t
n,m,s,t
n,m,s,t
接下来
m
m
m行,每行三个整数
u
,
v
,
w
u,v,w
u,v,w表示有一条大道连接区
u
u
u和区
v
v
v,且拥挤度为
w
w
w
两个区之间可能存在多条大道
【输出格式】
输出一行一个整数,代表最大的拥挤度
【输入样例】
3 3 1 3
1 2 2
2 3 1
1 3 3
【输出样例】
2
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10010, M = 20010;
int n, m, s, t;
int pre[N];
struct Edge
{
int x, y, w;
bool operator< (const Edge &t) const
{
return w < t.w;
}
}e[M];
int find(int key)
{
if (pre[key] == key) return key;
return pre[key] = find(pre[key]);
}
//Kruskal思路:将每条道路按拥挤度从小到大排序,然后逐条选择,若连通了s和t区,
//则最后选择的路径就是s到t的拥挤度最小的路径中拥挤度的最大值
int kruskal(int n, int m)
{
sort(e + 1, e + 1 + m);
for (int i = 1; i <= m; i++)
{
int px = find(e[i].x), py = find(e[i].y);
if (px != py)
{
pre[px] = py;
if (find(s) == find(t))//若s, t已连通
return e[i].w;
}
}
}
int main()
{
cin >> n >> m >> s >> t;
for (int i = 1; i <= n; i++) pre[i] = i;//初始化并查集
for (int i = 1; i <= m; i++)
cin >> e[i].x >> e[i].y >> e[i].w;
cout << kruskal(n, m) << endl;
return 0;
}