题目描述

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