易错点:
这题标准最小生成树算法题,套模板即可,注意并查集的查询函数一定要进行路径压缩(无论是递归或非递归方式),否则会超时。
#include<bits/stdc++.h>
using namespace std;
const int maxn=100000;
struct edge{
int u,v,cost;
}E[maxn];
bool cmp(edge a,edge b){
return a.cost<b.cost;
}
int father[maxn];
int findfather(int x){ //并查集查询函数
int a=x;
while(x!=father[x]){
x=father[x];
}
//路径压缩
while(a!=father[a]){
int z=a;
a=father[a];
father[z]=x;
}
return x;
}
int kruskal(int n,int m){ //标准算法
int ans=0,Num_Edge=0;
for(int i=1;i<=n;i++){
father[i]=i;
}
sort(E,E+m,cmp);
for(int i=0;i<m;i++){
int faU=findfather(E[i].u);
int faV=findfather(E[i].v);
if(faU!=faV){
father[faU]=faV;
ans=E[i].cost;
Num_Edge++;
if(Num_Edge==n-1)break;
}
}
return ans;
}
int main(){
int n,m,root,u,v,t;
//输入
cin>>n>>m>>root;
for(int i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&t);
E[i]={u,v,t};
}
//处理
int ans=kruskal(n,m);
//输出
cout<<ans;
}
递归并查集查询算法(含路径压缩)
int findfather(int x){
return x==father[x] ? x : father[x]=findfather(father[x]);
}