打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
NOIP训练营内部训练题!

  

解析在代码后,记得先思考哦

#include

#include

#include

using namespace std;

const int mod=1e9+7;

#define N 100001

int front[N],to[N<><>

bool vis[N];

int d[N];

queueq;

int ans=1;


void read(int &x)

{

    x=0; char c=getchar();

    while(!isdigit(c)) c=getchar();

    while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }

}


void add(int u,int v)

{

    to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;

    to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;

    d[v]++;

}


bool bfs(int s)

{

    while(!q.empty()) q.pop();

    int p=0,e=0;

    q.push(s); vis[s]=true;

    int now; 

    while(!q.empty())

    {

        now=q.front(); q.pop();

        p++; e+=d[now];

        for(int i=front[now];i;i=nxt[i])

            if(!vis[to[i]]) vis[to[i]]=true,q.push(to[i]);

    }

    if(e>p) return false;

    if(e==p) ans=ans*2%mod;

    else ans=1ll*ans*p%mod;

    return true;

}


int main()

{

    freopen('girl.in','r',stdin);

    freopen('girl.out','w',stdout);

    int n,m;

    read(n); read(m);

    int u,v;

    for(int i=1;i<>

    {

        read(u); read(v);

        add(u,v);

    }

    for(int i=1;i<>

        if(!vis[i]) 

            if(!bfs(i)) { cout<0; return="" 0;="">

    cout<>

    return 0;

}


将每个联通块的贡献乘起来就是答案

如果一个联通块的边数>点数 ,那么无解

如果边数=点数,那么贡献是 2

如果边数=点数-1,那么贡献是点数


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存
猜你喜欢
类似文章
真心想要追求你的男人,会有的3种表现,女人要用心观察
100多年前,外国人拍摄的北京城,9座城门都在,护城河太漂亮了
冰热两重天幽默句
中医体检表!自己对照一下吧!
一个家庭,若有四五十岁的70后男人,找不到对象,说明了三个原因
与人交谈十二个“忌讳”!
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服