并查集

来源:互联网 发布:杨春秋软件俱乐部 编辑:程序博客网 时间:2024/05/07 06:01
#include<iostream>#include<algorithm>using namespace std;int r[100005];int p[100005];int n,m;void init(){    for(int i=0;i<=n;i++)    {        p[i]=i;        r[i]=0;    }}int Find(int x){    if(x!=p[x])    {        int k=Find(p[x]);        r[x]=(r[x]+r[p[x]])%2;        p[x]=k;    }    return p[x];}void UnionSet(int x,int y,int xx,int yy){    p[yy]=xx;    r[yy]=(r[x]+1-r[y]+2)%2;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        init();        for(int i=0;i<m;i++)        {            char s[10];            int x,y;            scanf("%s%d%d",s,&x,&y);            int xx=Find(x);            int yy=Find(y);            //cout<<xx<<endl<<yy<<endl;            if(s[0]=='A')            {                if(xx!=yy)                {                    printf("Not sure yet.\n");                }                else                {                    if(r[x]==r[y])                    {                        printf("In the same gang.\n");                    }                    else                        printf("In different gangs.\n");                }            }            else            {                if(xx!=yy)                {                    UnionSet(x,y,xx,yy);                }            }        }    }    return 0;}

0 0