少女

来源:互联网 发布:7.0魔兽世界mac客户端 编辑:程序博客网 时间:2024/04/26 03:30

少女在图上开车,她们希望把图上每条边分配给与其相连的点中的一个,
并且每个点最多被分配一条边,问可能的方案数。
【输入格式】
第一行两个整数 N ,M代表点数和边数。
接下来N行每行两个整数代表一条边。
【输出格式】
一行一个整数代表答案对10 E9 + 7取模之后的值。
【样例输入】
5 4
1 2
3 2
4 5
4 5
【样例输出】
6


树中方案为size,有环即为2.

#include <cstdio>#include <iostream> #define ll long longusing namespace std;const int maxm=210000;const int mod=1e9+7;int head[maxm],to[2*maxm],net[2*maxm];ll cnt,size,m;int n;bool cir;bool vis[maxm];void add(int x,int y){    cnt++;    to[cnt]=y;    net[cnt]=head[x];    head[x]=cnt;}void dfs(int x,int fat){    size++;    vis[x]=1;    for(int i=head[x];i;i=net[i])    if(to[i]!=fat)    {        if(vis[to[i]]) cir=1;        else dfs(to[i],x);    }    return;}int main(){    freopen("girl.in","r",stdin);freopen("girl.out","w",stdout);    scanf("%d%lld",&n,&m);    for(int i=1;i<=m;i++)    {        int x,y;        scanf("%d%d",&x,&y);        add(x,y);        add(y,x);    }    ll ans=1;    for(int i=1;i<=n;i++)    if(!vis[i])    {        size=0,cir=0;        dfs(i,0);        if(cir) ans=(ans*2ll)%mod;        else ans=(ans*1ll*size)%mod;        //printf("%d ",size);    }    printf("%lld",ans%mod);}
原创粉丝点击