带权并查集求同性恋

#include <bits/stdc++.h>
using namespace std;
int p[2005],v[2005],f;
int fin(int x)
{
    if(x==p[x])
    return p[x];
    int tmp=fin(p[x]);
    v[x]^=v[p[x]];//路径压缩时修改节点与祖先的关系 
    p[x]=tmp;
    return p[x];
}
void join(int x,int y)
{
    int fx=fin(x);
    int fy=fin(y);
    if(fx!=fy)
    {
        p[fx]=fy;//归并后修改关系
        if(v[y]==0)
            v[fx]=1-v[x];
        else
            v[fx]=v[x];
    }
    else//已经有相同祖先
    {
        if(v[x]==v[y])f=0;
    }
}
int main()
{
    int T,n,m,a,b;
    scanf("%d",&T);
    for(int ii=1;ii<=T;ii++)
    {
        f=1;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            p[i]=i;
            v[i]=0;
        }
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&a,&b);
            if(f)join(a,b);
        }
        printf("Scenario #%d:\n",ii);
        if(f)printf("No suspicious bugs found!\n");
        else printf("Suspicious bugs found!\n");
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42756710/article/details/81232018
今日推荐