poj1703

来源:互联网 发布:在vb集成开发环境中 编辑:程序博客网 时间:2024/04/30 17:57
看了一天的 并查集 路径压缩 做一道简单的题目 
现在对它有了一点认识。
还得继续努力  加油。
//题意  判断两个人是不是属于相同的的犯罪集团.不相同 或 不确定 三种可能。
#include<stdio.h>#define max 100010int far[max];int rank[max];void inti(){    int i;    for(i=1; i<=max; i++)    {        far[i]=i;//自己独自是一棵树;        rank[i]=0;//开始定义偏移量为0;    }}int find_set(int n)//路径压缩 0表示不同 1表示相同{    int tem;    if(n==far[n])      return n;    tem=far[n];//tem 找到前驱。    far[n]=find_set(tem);    rank[n]=(rank[tem]+rank[n])%2;    return far[n];}void Union_set(int a,int b){    int aa,bb;    aa=find_set(a);    bb=find_set(b);    far[bb]=aa;    rank[bb]=(rank[a]+1-rank[b])%2;}int  main(){    int T;    int n,m,nn,mm;    char a;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&m);        inti();        for(int j=0; j<m; j++)        {            getchar();            scanf("%c %d %d",&a,&nn,&mm);            if(a=='A')            {               //  printf("a=%c\n",a);                int ans1=find_set(nn);                int ans2=find_set(mm);               // printf("1=%d 2=%d\n",ans1,ans2);                //判断是不是在一个集合里面。                if(ans1==ans2)                {                    if(rank[nn]==rank[mm])                    {                        printf("In the same gang.\n");                    }                    else                    {                      printf("In different gangs.\n");                    }                }                else                {                 printf("Not sure yet.\n");                }            }            else            {                Union_set(nn,mm);            }        }    }    return 0;}

原创粉丝点击