最小生成树模板
最小生成树模板
题目描述
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 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;
}

浙公网安备 33010602011771号