并查集

http://blog.csdn.net/dellaserss/article/details/7724401/
hdu1232
#define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<algorithm> #include<string> #include<cmath> #include<cstdio> using namespace std; int pre[1000]; int find(int x)//查找根节点 { int r = x; while (pre[r]!=r)//返回根节点r { r = pre[r]; } int i=x, j; while (pre[i] != r)//路径压缩 { j = pre[i]; pre[i] = r; i = j; } return r; } void join(int x, int y)//判断x与y是否连通。如果不连通,就把它们所在的连通分支合并起来 { int fx = find(x), fy = find(y); if (fx != fy) { pre[fx] = fy; } } int t[1001]; int main() { int n, m; int x, y; while (scanf("%d", &n) != EOF && n) { for (int i = 1; i <= n; i++) { pre[i] = i; } scanf("%d", &m); while (m--) { scanf("%d%d", &x, &y); join(x, y); } memset(t, 0, sizeof(t)); for (int i = 1; i <= n; i++) { t[find(i)] = 1; } int ans = 0; for (int i = 1; i <= n; i++) { if (t[i]) ans++; } printf("%d\n", ans - 1); } return 0; }

  

posted @ 2017-03-16 17:25  web之路  阅读(82)  评论(0编辑  收藏  举报