题目背景
“咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动得热泪盈眶,开起了门……
题目描述
妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了 t 区,而自己在 s 区。
该市有 m 条大道连接 n 个区,一条大道将两个区相连接,每个大道有一个拥挤度。小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐。所以请你帮她规划一条从 s 至 t 的路线,使得经过道路的拥挤度最大值最小。
输入格式
第一行有四个用空格隔开的 n,m,s,t,其含义见【题目描述】。
接下来 m 行,每行三个整数 u,v,w,表示有一条大道连接区 u 和区 v,且拥挤度为 w。
两个区之间可能存在多条大道。
输出格式
输出一行一个整数,代表最大的拥挤度。
输入输出样例
输入 #1
3 3 1 3 1 2 2 2 3 1 1 3 3
输出 #1
2
说明/提示
数据规模与约定
- 对于 30% 的数据,保证 n≤10。
- 对于 60% 的数据,保证 n≤100。
- 对于 100% 的数据,保证 1≤n≤104,1≤m≤2×104,w≤104,1≤s,t≤n。且从 s 出发一定能到达 t 区。
样例输入输出 1 解释
小明的妈妈要从 1 号点去 3 号点,最优路线为 1->2->3。
#include<bits/stdc++.h>
using namespace std;
int n, m, s, t;
int a[20001];
struct each {
int u, v, w;
} b[20001];
bool cmp(each u, each v) {
return u.w < v.w;
}
int getf(int v) {
if (a[v] == 0) return v;
return a[v] = getf(a[v]);
}
void merge(int u, int v) {
int t1, t2;
t1 = getf(u);
t2 = getf(v);
if (t1 != t2) {
a[t2] = t1;
}
}
int main() {
cin >> n >> m >> s >> t;
for (int i = 1; i <= m; i++) {
cin >> b[i].u >> b[i].v >> b[i].w;
}
sort(b + 1, b + m + 1, cmp);
for (int i = 1; i <= m; i++) {
merge(b[i].u, b[i].v);
if (getf(s) == getf(t)) {
cout << b[i].w;
return 0;
}
}
return 0;
}