cruskal算法
#include<bits/stdc++.h>
using namespace std;
const int N=500005;
int n,m;
struct node//定义结构体
{
int in;
int to;
int v;
};
struct node edge[N];
bool cmp(struct node a,struct node b)
{
return a.v<b.v;//对结构体中的x.v进行比较,>按降序排列,<按升序排列
}
int pre[N];
int fid(int x)//查找
{
if(pre[x]==x)
return x;
else
{
pre[x]=fid(pre[x]);
return pre[x];
}
}
void unin(int x,int y)//合并
{
pre[fid(x)]=fid(y);
}
void kruskal()
{
int s=0,k=0;
for(int i=1;i<=m;i++)
{
if(fid(edge[i].in)!=fid(edge[i].to))//如果两点的祖先相同,则说明形成了环,不成立
{
s++;//表示满足条件的边的条数
k+=edge[i].v;//路径总长度
unin(edge[i].in,edge[i].to);//将这两个点放入关系图中
//cout<<"k="<<k<<endl;
}
else
continue;
if(s==n-1)//n个节点连接最少需要n-1条边
{
printf("%d",k);
break;
}
}
if(s<n-1)//如果小于n-1条边,就说明不能所有点联通
printf("orz");
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>edge[i].in>>edge[i].to>>edge[i].v;
pre[i]=i;//刚开始祖先都为自己本身
}
sort(edge+1,edge+m+1,cmp);//输入结构体变量,对结构体中的某一个成员进行排序
//for(int i=1;i<=m;i++)
//cout<<edge[i].in<<" "<<edge[i].to<<" "<<edge[i].v<<endl;
kruskal();
}