//最小生成树
//Kruskal
struct Edge
{
int from,to;
int weight;//每条边的权值
}edge[200005];
int parent[5001];
int N,M,num=0,sum=0;
//快排的依据(按边权排序)
bool cmp(Edge a,Edge b)
{
return a.weight<b.weight;
}
//找根节点
int findRoot(int x)
{
return parent[x] == x ? parent[x] : parent[x] = findRoot(parent[x]);//路径压缩
}
int main()
{
cin>>N>>M;
for(int i=1;i<=N;i++)
{
parent[i]=i;
}
for(int i=1;i<=M;i++)
{
cin>>edge[i].from>>edge[i].to>>edge[i].weight;
}
//边排序
sort(edge+1,edge+1+M,cmp);
//开始生成树
int R1,R2;
for(int i=1;i<=M;i++)
{
R1=findRoot(edge[i].from);
R2=findRoot(edge[i].to);
if(R2!=R1)
{
parent[R2]=R1;//设置R2的根节点为R1
sum+=edge[i].weight;
if(++num==N-1)
break;
}
}
if(num==N-1)
cout << sum;
else
cout << "orz";
return 0;
}
最小生成树 kruskal算法
最新推荐文章于 2024-07-15 13:32:43 发布