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);    }}

原创粉丝点击