HDOJ1233 畅通工程之一(最小生成树Kruscal)

题目:

  1233 还是畅通工程
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 #define M 101
 8 typedef struct{
 9     int x,y;
10     int len;
11 }EDGE;
12 
13 EDGE edge[M*M];
14 int Map[M][M];
15 int n,m;
16 int set[M];
17 
18 void ReadMap();
19 void InitSet();
20 int cmp(const EDGE &a,const EDGE &b);
21 int FindSet(int a);
22 void MergeSet(int a,int b);
23 void main()
24 {
25     int c,s,f,t;
26     while (scanf("%d",&n),n)
27     {
28         m = (n*(n-1))>>1;
29         ReadMap();
30         InitSet();
31         c = 0;//choosed node
32         s = 0;//sum length
33         sort(edge,edge+m,cmp);//sort the edges
34         for (int i=0;i<m && c!=n;i++)
35         {
36             f = FindSet(edge[i].x);
37             t = FindSet(edge[i].y);
38             if (f!=t)
39             {
40                 MergeSet(f,t);
41                 c++;
42                 s += edge[i].len;
43             }
44         }
45         cout<<s<<endl;
46 
47     }
48 }
49 void ReadMap()
50 {
51     for (int i=0;i<m;i++)
52         cin>>edge[i].x>>edge[i].y>>edge[i].len;
53 }
54 void InitSet()
55 {
56     for (int i=1;i<=n;i++)
57         set[i] = i;
58 }
59 int cmp(const EDGE &a,const EDGE &b)
60 {
61     return a.len<b.len;
62 }
63 int FindSet(int a)
64 {
65     return set[a];
66 }
67 void MergeSet(int a,int b)
68 {
69     for (int i=1;i<=n;i++)
70     {
71         if (set[i] == a)
72         {
73             set[i] = b;
74         }
75     }
76 }
字节跳动内推

找我内推: 字节跳动各种岗位
作者: ZH奶酪(张贺)
邮箱: cheesezh@qq.com
出处: http://www.cnblogs.com/CheeseZH/
* 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/CheeseZH/p/2716903.html