Description
妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了t区,而自己在 s 区。
该市有 m 条大道连接 n 个区,一条大道将两个区相连接,每个大道有一个拥挤度。小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐。所以请你帮她规划一条从 s 至 t 的路线,使得经过道路的拥挤度最大值最小。
Input
第一行有四个用空格隔开的 n,m,s,t,其含义见【题目描述】。
接下来 m 行,每行三个整数 u,v,w表示有一条大道连接区 u 和区 v,且拥挤度为 w。两个区之间可能存在多条大道。
Output
输出一行一个整数,代表最大的拥挤度。
Sample Input
3 3 1 3
1 2 2
2 3 1
1 3 3
Sample Output
2
解题思路
显然当s和t在MST中时候,便结束循环,因为边是按照从小到大排序,所以此时ans的结果便是最大的
//freopen("hao.txt","r",stdin);
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 10005;
struct Edge
{
int src;
int dest;
int weight;
}edge[20005];
struct subset
{
int parent;
int rank;
}subsets[N];
bool cmp(struct Edge a,struct Edge b)
{
return a.weight<b.weight;
}
int find(int x)
{
if(subsets[x].parent!=x)
subsets[x].parent = find(subsets[x].parent);
return subsets[x].parent;
}
void Union(int x,int y)
{
int x_root = find(x);
int y_root = find(y);
if(subsets[x_root].rank<subsets[y_root].rank)
subsets[x_root].parent = y_root;
else if(subsets[x_root].rank>subsets[y_root].rank)
subsets[y_root].parent = x_root;
else {
subsets[x_root].parent = y_root;
subsets[y_root].rank++;
}
}
void kruskal(int n,int m,int s,int t)
{
// 点数
int V = n;
// 边数
int E = m;
int v = 0;
int e = 0;
int ans = 0;
for(int i=1;i<=V;i++) {
subsets[i].rank = 0;
subsets[i].parent = i;
}
sort(edge+1,edge+E+1,cmp);
for(int i=1;i<=E;i++) {
Edge next_edge;
next_edge = edge[i];
int x = find(next_edge.src);
int y = find(next_edge.dest);
if(find(s)==find(t))
break;
if(x!=y) {
Union(x,y);
ans=next_edge.weight;
}
}
cout<<ans;
}
int main()
{
int n = 0,m = 0,s = 0,t = 0;
int u = 0,v = 0,weight = 0;
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++) {
scanf("%d%d%d",&u,&v,&weight);
edge[i].src = u;
edge[i].dest = v;
edge[i].weight = weight;
}
kruskal(n,m,s,t);
return 0;
}