输入案例
4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2
输出格式
4
思路分析
其实这道题要求的答案,就是对给出的图,求出其所有可能的生成树里,最大的边权最小的那棵生成树,然后输出它的那个最大的边权。
我们知道,最小生成树一定是瓶颈生成树,那么直接求最小生成树即可——并查集。
题目给出的root变量毫无卵用 #(滑稽)。
那怎么求出我们想要的最小生成树呢?对所有的边初始化排序,按照权值由小到大,然后执行并查集操作,每次都记下当前的max权值,把所有的边跑完并查集之后,答案就出来了。
//这真的是CSP的题目嘛
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAX=500001;
int n,m,root;
int father[MAX];
struct Node
{
int u,v,w;
bool operator<(const Node &W) const
{
return w < W.w;
}
}node[MAX];
int findfather(int x)
{
return father[x] == x ? x : father[x] = findfather(father[x]);
}
int kruskal()
{
int res=0;
for(int i=1;i<=n;i++)
father[i]=i;
sort(node,node+m);
for(int i=0;i<m;i++)//认爹
{
int a=node[i].u;
int b=node[i].v;
int faA=findfather(a);
int faB=findfather(b);
if(faA!=faB)
{
father[faA]=faB;
res=max(res,node[i].w);
}
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m>>root;
for(int i=0;i<m;i++)
{
cin>>node[i].u>>node[i].v>>node[i].w;
}
cout<<kruskal();
return 0;
}