Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 65535/65535 K
(Java/Others)
Total Submission(s): 840 Accepted
Submission(s): 340
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int father[10005], a[100005], b[100005], block[100005]; int find(int x) { return x == father[x] ? x : father[x] = find(father[x]); } void unit(int x, int y) { int a = find(x); int b = find(y); father[a] = father[b]; return ; } int main(int argc, char const *argv[]) { int n, m; //freopen("in.c", "r", stdin); while(~scanf("%d%d", &n, &m)) { memset(block, 0, sizeof(block)); for(int i = 0; i < n; i ++) father[i] = i; for(int i = 0; i < m; i ++) scanf("%d%d", &a[i], &b[i]); for(int i = m-1; i >= 0; i --) { block[i] = n; if(find(a[i]) != find(b[i])) { n--; unit(a[i], b[i]); } } for(int i = 0;i < m; i ++) printf("%d\n", block[i]); } return 0; }
原文:http://www.cnblogs.com/anhuizhiye/p/3603553.html