最小生成树-Kruskal算法:时间复杂度 O(mlogm) ,m为边数
模板题:P3366 【模板】最小生成树
Code:
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int u,v,w;
bool operator<(const node &A)const{
return w<A.w;
}
};
const int MAX_N=5e3+5;
const int MAX_M=2e5+5;
int n,m;
node e[MAX_M];
int f[MAX_N];
int Find(int x){
if(f[x]!=x) f[x]=Find(f[x]);
return f[x];
}
void Union(int a,int b){
f[Find(a)]=Find(b);
}
int Kruskal()
{
int res=0;
for(int i=1;i<=n;++i)
f[i]=i;
sort(e,e+m);
int u,v,w,cnt=n-1;
for(int i=0;i<m&&cnt;++i)
{
u=e[i].u; v=e[i].v; w=e[i].w;
if(Find(u)!=Find(v)){
res+=w; --cnt;
Union(u,v);
}
}
if(cnt) res=-1;
return res;
}
int main()
{
scanf("%d%d",&n,&m);
int u,v,w;
for(int i=0;i<m;++i)
{
scanf("%d%d%d",&u,&v,&w);
e[i]={u,v,w};
}
int res=Kruskal();
if(res!=-1) printf("%d\n",res);
else printf("orz\n");
return 0;
}