题目大意:n代表n座城市,m代表m条关系。刚开始所有的城市都是连在一起的,这样就是一个联通分量,然后给出m条关系,每条关系x y 代表x y之间有一条通道使两座城市相连,问按顺序去掉这样的通道后,每次去掉一条会变成几个联通分量。
解题思路:这题题目保证最后一定会变成n个联通分量,即这n个城市都是不相连,这样从后往前每一条边的加入可能会改变联通分量的个数,这样的话用并查集从后往前每合并了一个城市,就使得当前的联通分量数--,记录下联通分量的个数,最后再倒着输出。
代码:
#include <stdio.h> const int N = 10005; const int M = 100005; int f[N], n, m, s[M][2], ans[M]; void init () { for (int i = 0; i < n; i++) f[i] = i; } int getfather(int x) { return x == f[x] ? x: f[x] = getfather (f[x]); } int main () { while (scanf ("%d%d", &n, &m) != EOF) { init (); int temp = n; for (int i = 0; i < m; i++) scanf ("%d%d", &s[i][0], &s[i][1]); ans[m] = n; for (int i = m - 1; i >= 0; i--) { int p = getfather (s[i][0]); int q = getfather (s[i][1]); if (q == p) ans[i] = temp; else { f[p] = q; ans[i] = --temp; } } for (int i = 1; i <= m; i++) printf ("%d\n", ans[i]); } return 0; }
hdu 4496 D-City(并查集),码迷,mamicode.com
原文地址:http://blog.csdn.net/u012997373/article/details/24842003