题目
思路
乍看这道题有点难懂,但是看了数据才明白要求的是生成树中的最大边中的最小边,也就是求最小生成树的问题跟上一道题一样,不过注意的是要写路径压缩后的代码,否则会超时。
当然最大中取最小也可以用二分的方法,在这里就不用了。
代码
#include<iostream>
#include<algorithm>
using namespace std;
int par[50005];
int rak[50005];
int n,m,rt;
struct Edge{
int u;
int v;
int w;
}edge[100005];
int cmp(Edge a,Edge b)
{
return a.w<b.w;
}
void init(int n)
{
for(int i=0;i<=n;i++)
{
par[i]=i;
rak[i]=1;
}
}
int find(int x)
{
if(par[x]==x)
return x;
else
return par[x]=find(par[x]);
}
bool unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)
return false;
if(rak[x]>rak[y])
swap(x,y);
par[x]=y;
rak[y]+=rak[x];
return true;
}
int kruskal()
{
sort(edge+1,edge+1+m,cmp);
int cnt=0,ans=0;
for(int i=1;i<=m;i++)
{
if(unite(edge[i].u,edge[i].v))
{
ans=max(ans,edge[i].w);
if(++cnt==n-1)
break;
}
}
return cnt==n-1?ans:-1;
}
int main()
{
cin>>n>>m>>rt;
init(n);
for(int i=1;i<=m;i++)
cin>>edge[i].u>>edge[i].v>>edge[i].w;
cout<<kruskal()<<endl;
return 0;
}