正文

并查集的应用PKU17032008-08-21 13:13:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lqf110/37759.html

分享到:

/////////////////////////////////////////
//作品名称:并查集应用
//作者姓名:满天飞
//作品时间:2008-8-15
//最后修改:2008-8-15
//Q Q 号码:280282813
//版权所有,翻版必究
/////////////////////////////////////////


#include<stdio.h>
#define MAX 100010
int ary[MAX];
int opt[MAX];
void Init(int n)
{
    int i;
    for(i = 0; i <= n+10; ++i)
    {
        ary[i] = -1;
        opt[i] = -1;
    }
}

int Find(int index)
{
    if(ary[index] < 0)
        return index;
    return ary[index] = Find(ary[index]);
}
int Union(int first, int second)
{
    int i, j;
    if(second == -1)
        return first;

    i = Find(first);
    j = Find(second);
    if(i == j)
        return i;
    if(ary[i] < ary[j])
    {
        ary[i] += ary[j];
        ary[j] = i;
        return i;
    }
    else
    {
        ary[j] += ary[i];
        ary[i] = j;
        return j;
    }
    return -1;
}

void UnionDiff(int first, int second)
{
    int r1, r2, d1, d2;
    r1 = Find(first);
    r2 = Find(second);
    if(r1 == r2)
        return;
    //合并两次
    d1 = Union(r1, opt[r2]);
    d2 = Union(r2, opt[r1]);
    opt[d1] = d2;
    opt[d2] = d1;
}

int main(int argv, char* argc[])
{
    int cases, num, msg, i, f, s, r1, r2;
    char ch;
    scanf("%d", &cases);
    while(cases--){
        scanf("%d%d", &num, &msg);
        Init(num);
        for(i = 0; i < msg; ++i){
            getchar();
            scanf("%c %d %d", &ch, &f, &s);
            if(ch == 'D')
                UnionDiff(f, s);
            else{
                r1 = Find(f);
                r2 = Find(s);
                if(r1 == r2)
                    printf("In the same gang.\n");
                else if(r1 == opt[r2])
                    printf("In different gangs.\n");
                else printf("Not sure yet.\n");
            }
        }
    }
    return 0;
}


阅读(3312) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册