最小生成树之kruskal

#include<cstdio>
struct type{int x,y,z;} node[100000],me;
int f[100000],n,m;
void sort(int l,int r)//快排
{
int x=l,y=r,k;
k=node[(l+r)/2].z;
do
{
for(;node[x].z<k;x++){};
for(;node[y].z>k;y--){};
if (x<=y)
{me=node[x];node[x]=node[y];node[y]=me;x++;y--;};
}while(x<y);
if (x<r) sort(x,r);
if (l<y) sort(l,y);
}
int find(int x)//并查集;
{
if (f[x]!=x){ f[x]=find(f[x]);};//找到x的祖先,把它直接附给f[x] ;
return f[x];//返回x的祖先;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=0;i<m;i++)scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].z);
sort(0,m-1);//按路程长短排序;
int x1,x2,y1,y2,j=0,z,b=0;
long long d=0;
for (int i=0;i<n;i++) f[i]=i;
while (b<n-1)//找到当前不相连的结点的,将其长度累加进d;
{
x1=find(node[j].x);x2=find(node[j].y);
if (x1!=x2) {f[x1]=x2;b++;d+=node[j].z; };
j++;
}
printf("%lld",d);
return 0;
}

原文地址:https://www.cnblogs.com/qingang/p/5078317.html