<hdu - 1232> 畅通工程 并查集问题 (注意中的细节)

  本题链接http://acm.hdu.edu.cn/showproblem.php?pid=1232

 结题思路:因为题目是汉语的,那我就不解释题意了,要求的是最少建设的道路,我们可以用并查集来做这道题,因为并查集上的数字和下标都是相连的。题目只需要求没有相连的(i == father[i])即可。

 注意细节:本题说是从1到N开始计数(虽然测试答案是对的,就是过不了)、输入的时候注意最后只是输入一个0就结束了,所以M和N要分开输,即输入N为0的时候。

 我的代码:(因为是模板题,建议码友自己写一遍,代码仅供参考):

 1 #include <iostream>
 2 #define maxn 10000
 3 using namespace std;
 4 int par[maxn];
 5 
 6 void init (int n) {
 7     for (int i = 1; i <= n; ++i) //从1到N编号
 8         par[i] = i;
 9 }
10 
11 int find(int x) {        //查找
12     while(par[x] != x)
13         x = par[x];
14     return x;
15 }
16 
17 void unite (int x, int y) {        //合并函数
18     int fx = find (x), fy = find (y);
19     if (fx != fy)
20         par[fx] = fy;
21 }
22 
23 int main () {
24     int m, n;
25     int a, b;
26     while (cin >> m && m ) {//注意当输入一个0 的时候就停止
27         cin >> n;
28         init (m);
29         for (int i = 1; i <= n; ++i) {
30             cin >> a >> b;
31             unite (a, b);
32         }
33         int t = 0;
34         for (int i = 1; i <= m; ++i) {        //求独立的点
35             if (par[i] == i)
36                 t ++;
37         }
38         cout << t - 1 << endl;
39     }
40     return 0;
41 }
View Code

  欢迎码友评论,一起成长。

posted @ 2016-07-29 15:47  Codorld  阅读(136)  评论(0编辑  收藏  举报