[kuangbin带你飞]专题五 并查集---A Bug's Life(种类并查集---带权并查集)

A Bug’s Life(poj2492)

vj传送门
[kuangbin带你飞]专题五 并查集---A Bug's Life(种类并查集---带权并查集)_第1张图片
[kuangbin带你飞]专题五 并查集---A Bug's Life(种类并查集---带权并查集)_第2张图片

题意:

有两个性别的虫子,问是否有(“a man is ketty”)同性恋。

思路:

转换为带权并查集。
带权并查集的模板+mod。

AC

#include 
#include 
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
using namespace std;
const int maxm=1e6+10;
const int maxn=2e3+10;
const int mod=2;
int a[maxm],b[maxm];
int f[maxn],dis[maxn];
int find(int x)
{
     
    if(x==f[x])return x;
    int root=find(f[x]);
    dis[x]=(dis[x]+dis[f[x]])%mod;
    return f[x]=root;
}
int main()
{
     
    int t,kase=0;
    scanf("%d",&t);
    while(t--)
    {
     
        int n,m;
        scanf("%d%d", &n,&m);
        For(i,1,n)f[i]=i,dis[i]=0;
        For(i,1,m)scanf("%d%d", &a[i],&b[i]);
        int flag=1;
        For(i,1,m)
        {
     
            int A=find(a[i]);
            int B=find(b[i]);
            if(A==B)
            {
     
                if(dis[a[i]]==dis[b[i]])
                {
     
                    flag=0;
                    break;
                }
            }
            else
            {
     
                f[A]=B;
                dis[A]=(dis[b[i]]-dis[a[i]]+1+mod)%mod;
            }
        }
        printf("Scenario #%d:\n",++kase);
        if(flag)printf("No suspicious bugs found!\n");
        else printf("Suspicious bugs found!\n");
        cout<<'\n';
    }
    return 0;
}

你可能感兴趣的:(#,并查集)