【并查集判环】Day 8 提高组模拟C组 T4 黑魔法师之门

题目大意

给定 n 个点和 m 条无向边,求出每个无向边连边前的所有入度出度之和为偶数且联通的子图个数

解题思路

并查集判环
因为一条无向边会使两个点的入度和出度分别+1,那么其实当入度出度之和为偶数时其实也就相当于入度等于出度时,再加上联通的条件,那么这就是一个环,于是,该题目就变成了一个并查集判环的问题。

代码

#include<cstdio>
#define LL long long
using namespace std;
int f[200001],n,m,x,y;
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
void judge(int x,int y){f[find(x)]=find(y);return;}
LL ans=1,d;char c;
inline LL read()
{
    d=0;
    while(c=getchar(),c<=47||c>=58);d=(d<<3)+(d<<1)+c-48;
    while(c=getchar(),c>=48&&c<=57) d=(d<<3)+(d<<1)+c-48;
    return d;
}
void write(LL x){if(x>9) write(x/10);putchar(x%10+48);return;}
int main()
{
    n=read();m=read();
    for(int i=1;i<=n;i++) f[i]=i;
    while(m--)
    {
        x=read();y=read();
        if(find(x)==find(y)) ans<<=1,ans%=1000000009;//乘2
        judge(x,y);
        write(ans-1);putchar(10);//记得-1
    }
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81037952
今日推荐