karuska算法:
#include<iostream>
using namespace std;
int d[100];//用来记录边的一顶点;
int u[100];//另一顶点;
int w[100];//权值;
int p[100];//并查集是使用;
int g[100];//给边编号;
int sum;//统计权值最小和;
const int maxint=99999;
void shuru(int m)//m表示一共的边数;
{
for(int i=1;i<=m;i++)
cin>>d[i]>>u[i]>>w[i];
}
int cmp(const void * a,const void * b)
{
return w[*(int *)a]-w[*(int *)b];//排序比较,权值从小到大
}
int find(int x)
{
return x==p[x]?x:p[x]=find(p[x]);
}
void kruska(int n,int m)
{
sum=0;
for(int i=1;i<=n;i++)//初始化并查集,每个顶点都是一个集合;
p[i]=i;
for(int i=1;i<=m;i++)//给边编号;
g[i]=i;
qsort(g,m+1,sizeof(g[1]),cmp);
for(int k=1;k<=m;k++)
{
int h=g[k];//h就是真正的边;
int x=find(d[h]);//d[h]就是编号为h的边的顶点;
int y=find(u[h]);
if(x!=y)
{
cout<<x<<" "<<y<<endl;
sum+=w[h],p[x]=y;//合并集合;
}
}
cout<<"一共需要的最小权值为: "<<sum<<endl;
}
int main()
{
int n,m;
cin>>n>>m;
shuru(m);
kruska(n,m);
return 0;
}