本题链接: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 }
欢迎码友评论,一起成长。