码迷,mamicode.com
首页 > 其他好文 > 详细

最小生成树--模板

时间:2019-10-29 23:22:31      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:包含   namespace   marked   for   pre   生成树   turn   include   输入   

题目描述

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

输入格式

第一行包含两个整数N、M,表示该图共有N个结点和M条无向边。(N<=5000,M<=200000)

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

输出格式

输出包含一个数,即最小生成树的各边的长度之和;如果该图不连通则输出orz

注意数组范围

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 int fa[10000];
 6 struct node
 7 {
 8     int st;
 9     int ed;
10     int w;
11 };
12 node a[200000];
13 bool cmp(node a,node b)
14 {
15     return a.w<b.w;
16 }
17 int find(int x)
18 {
19     if (fa[x]==x) return x;
20     else return fa[x]=find(fa[x]);
21 }
22 int update(int x,int y)
23 {
24     return fa[x] = y;
25 }
26 int main()
27 {
28     int n,m;
29     scanf ("%d%d",&n,&m);
30     for (int i = 1;i <= n;i++)
31         fa[i]=i;
32     for (int i = 1;i <= m;i++)
33     {
34         scanf ("%d%d%d",&a[i].st,&a[i].ed,&a[i].w);
35     }
36     int ans=0;
37     int tot=0;
38     sort(a+1,a+m+1,cmp);
39     for (int i = 1;i <= m;i++)
40     {
41         if (find(a[i].st)!=find(a[i].ed))
42         {
43             update(find(a[i].st),find(a[i].ed));
44             ans+=a[i].w;
45             tot++;
46         }
47     }
48     if (tot==n-1)
49     cout<<ans;
50     else 
51     cout<<"orz";
52     return 0;
53 }

现学现卖!

最小生成树--模板

标签:包含   namespace   marked   for   pre   生成树   turn   include   输入   

原文地址:https://www.cnblogs.com/very-beginning/p/11762133.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!