标签:
对并查集理解之后就可以做这种题了,虽说这种题做的不多,这道题做过才这么快搞定,可是还是挺happy滴,加油
Description
Input
Output
Sample Input
Sample Output
Hint
Hint Huge input, scanf is recommended.
source:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84602#problem/B
先把所有的树初始化,自己是自己的树根,arr[i] = i;
然后每输入一组联通的道路,看它们是否在一棵树上,如果不在一棵树上就把他们连接在一棵树上,
最后看总共有几棵树,道路的数目等于树的数目减1
#include <cstdio> #define M 1010 int arr[M]; int findx(int x) { while(arr[x] != x) x = arr[x]; return x; } void fix(int x, int y) { int fx = findx(x); int fy = findx(y); if(arr[fx] != arr[fy]) arr[fx] = fy; } int main() { int n, m, a, b; while(scanf("%d%d", &n, &m), n) { int cnt = 0; for(int i = 1; i <= n; i++) arr[i] = i; for(int i = 0; i < m; i++) { scanf("%d%d", &a, &b); fix(a, b); } for(int i = 1; i <= n; i++) { if(arr[i] == i) cnt++; } printf("%d\n", cnt-1); } return 0; }
标签:
原文地址:http://www.cnblogs.com/rain-1/p/4798778.html