最小生成树模板

最小生成树模板

题目描述

如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz

输入格式

第一行包含两个整数 N,M,表示该图共有 N 个结点和 M条无向边。

接下来 M 行每行包含三个整数 Xi,Yi,Zi,表示有一条长度为 Zi 的无向边连接结点 Xi,Yi

输出格式

如果该图连通,则输出一个整数表示最小生成树的各边的长度之和。如果该图不连通则输出 orz

#include<iostream>
#include <algorithm>
using namespace std;
int n,m,i,x,y;
int fa[5001];
struct rec{
int x,y,z;
}edge[200001];
bool operator <(rec a, rec b){
return a.z<b.z;
}

int get(int x)
{
if(x==fa[x])return x;
return fa[x]=get(fa[x]);
}
int main()
{
int ans=0;
cin>>n>>m;
for(i=1;i<=m;i++)
{
cin>>edge[i].x>>edge[i].y>>edge[i].z;
}
sort(edge+1,edge+m+1);
for(i=1;i<=n;i++)
fa[i]=i;
for(i=1;i<=m;i++)
{

x=get(fa[edge[i].x]);
y=get(fa[edge[i].y]);
if(x==y)continue;
fa[x]=y;
ans=ans+edge[i].z;
}
cout<<ans;
}

posted @ 2020-08-20 06:29  weidan01  阅读(46)  评论(0)    收藏  举报