poj1703 种类并查集

来源:互联网 发布:澳洲工资算法 编辑:程序博客网 时间:2024/05/18 01:02

种类并查集,比poj1182水

#include <iostream>#include <cstring>using namespace std;const int N=100005;int father[N];int rank[N];int n,m;void init(){    memset(rank,0,sizeof(rank));    for (int i=0;i<=100000;i++)        father[i]=i;}int find(int x){    if (x==father[x])        return x;    int t=father[x];    father[x]=find(father[x]);    rank[x]=(rank[x]+rank[t])%2;    return father[x];}void Union(int a,int b){    int x=find(a);    int y=find(b);    if (x==y)        return ;    father[y]=x;    rank[y]=(rank[a]+rank[b]+1)%2;}int main(){    int T;    scanf("%d",&T);    while (T--)    {        scanf("%d%d",&n,&m);        init();        char d;        int a,b;        for (int i=1;i<=m;i++)        {            cin>>d;            scanf("%d%d",&a,&b);            if (d=='D')                Union(a,b);            if (d=='A')            {                 if (find(a)==find(b))                {                    int x=rank[a];                    int y=rank[b];                    if (x==y)                        cout<<"In the same gang."<<endl;                    else                        cout<<"In different gangs."<<endl;                }                else                    cout<<"Not sure yet."<<endl;            }        }    }    return 0;}


0 0