hdu2473
来源:互联网 发布:ripper算法是什么 编辑:程序博客网 时间:2024/05/17 23:31
主要是设置虚点,如果某个点被删,并不真正的把他从集合中删除,而是让他变成一个集合中没有的点,主要靠res数组完成;#include <cstdio>#include <cstring>using namespace std;const int maxn = 1e6+1e5+5;int f[maxn], res[maxn], ans;bool hash[maxn];void init(int x){ for(int i = 0; i < x; i++) f[i] = res[i] = i; ans = x;}int find_fa(int x){ return f[x] == x ? x : f[x] = find_fa(f[x]);}void merge(int x, int y){ x = find_fa(x); y = find_fa(y); if(x != y) f[x] = y;}void aff(int x){ res[x] = ans; f[ans] = ans; ans++;}int main(){ int n, m, k = 0; while(scanf("%d%d", &n, &m),n||m) { init(n); char s[5]; while(m--) { scanf("%s", s); if(s[0] == 'M') { int u, v; scanf("%d%d", &u, &v); merge(res[u], res[v]); } else { int u; scanf("%d", &u); aff(u); } } memset(hash, 0, sizeof(hash)); int cnt = 0; for(int i = 0; i < n; i++) { int x = find_fa(res[i]); if(!hash[x]) hash[x] = 1, cnt++; } printf("Case #%d: %d\n", ++k, cnt); }}