题目
样例输入
4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2
样例输出
4
样例说明
题目思路
题目简化:给定一个无向图中的边,求解最小生成树
题目思想:Kruskal
存储方式:自定义结构体,其中重载了运算符<,方便后续排序
实现: 将图中所有的边根据权重排序,从小到大依次遍历每一条边
判断该边加入后是否成环,如果成环返回false,弃掉这条边
若不成环,将边加入图中
进行下一个边的判断,直到图中的n个点全部连接起来,即已加入n-1条边
代码实现
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,root,cnt,ans;
struct node{
int l,r,value;
bool operator <(const node &p) const
{
return value<p.value;
}
}term[100005];
int par[100005],rnk[100005];
int find(int x) {return par[x]==x?x:par[x]=find(par[x]);}
bool unite(int x,int y)
{
x=find(x); y=find(y);
if(x==y) return false;
if(rnk[x]>rnk[y])
swap(x,y);
par[x]=y,rnk[y]=(rnk[x]+=rnk[y]);
return true;
}
int main()
{
freopen("b.txt","r",stdin);
cin>>n>>m>>root;
for(int i=0;i<m;i++)
cin>>term[i].l>>term[i].r>>term[i].value;
sort(term,term+m);
for(int i=0;i<m;i++)
{
rnk[i]=1;
par[i]=i;
}
for(int i=0;i<m;i++)
{
int r=term[i].r;int l=term[i].l;
if(unite(r,l))
{
ans=max(ans,term[i].value);
cnt++;
if(cnt==n) break;
}
}
cout<<ans;
return 0;
}