洛谷 P3366 【模板】最小生成树 题解
作者:互联网
题目描述
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz
。
输入格式
第一行包含两个整数 N,M,表示该图共有 N 个结点和 M 条无向边。
接下来 M 行每行包含三个整数 Xi,Yi,Zi,表示有一条长度为 Zi 的无向边连接结点 Xi,Yi。
输出格式
如果该图连通,则输出一个整数表示最小生成树的各边的长度之和。如果该图不连通则输出 orz
。
AC代码
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 5 ll n,m,x,y,z,fa[200010],tmp,ans; 6 struct node{ 7 ll x,y,z; 8 }a[200010]; 9 10 bool cmp(node a,node b) 11 { 12 return a.z<b.z; 13 } 14 15 int find(int x) 16 { 17 return fa[x]==x?x:fa[x]=find(fa[x]); 18 } 19 20 int main() 21 { 22 scanf("%lld%lld",&n,&m); 23 for (int i=1;i<=n;i++) 24 fa[i]=i; 25 for (int i=1;i<=m;i++) 26 { 27 scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].z); 28 } 29 sort(a+1,a+1+m,cmp); 30 for (int i=1;i<=m&&tmp<n-1;i++) 31 { 32 int t1=find(a[i].x),t2=find(a[i].y); 33 if (t1!=t2) 34 { 35 ans+=a[i].z; 36 tmp++; 37 fa[t1]=t2; 38 } 39 } 40 if (tmp<n-1) 41 cout<<"orz"; 42 else 43 cout<<ans; 44 return 0; 45 }
标签:node,输出,连通,洛谷,题解,ll,long,该图,P3366 来源: https://www.cnblogs.com/zeng-xin/p/15185414.html