hdu-1232 畅通工程---并查集
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1232
题目大意:
中文题
解题思路:
直接并查集,判断有多少不同的根节点,答案就是根节点的数目-1,因为还需要建的道路就是根节点之间两两连接即可
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1000 + 10; 4 int p[maxn]; 5 int n, m; 6 set<int>s; 7 void init() 8 { 9 s.clear(); 10 for(int i = 0; i < maxn; i++)p[i] = i; 11 } 12 int Find(int x) 13 { 14 return x == p[x] ? x : p[x] = Find(p[x]); 15 } 16 int main() 17 { 18 while(scanf("%d", &n) != EOF && n) 19 { 20 int x, y; 21 init(); 22 scanf("%d", &m); 23 while(m--) 24 { 25 scanf("%d%d", &x, &y); 26 p[Find(x)] = Find(y); 27 } 28 for(int i = 1; i <= n; i++) 29 { 30 s.insert(Find(i)); 31 } 32 cout<<(s.size() - 1)<<endl; 33 } 34 return 0; 35 }
越努力,越幸运