1 条题解
-
2
对于每个连通块统计方案数然后成起来。如果一个连通块边比点还多那一定会有冲突,所以只能是基环树或者树。
其中基环树有两种方案(互为反图)
树有 种方案,因为每个点都可以作为根,然后从根往下连。
#include<bits/stdc++.h> #define int long long #define N 100005 #define mod 1000000007 using namespace std; int n,m; int degree[N]; int head[N],ver[N<<1],nxt[N<<1],idx=-1; void add(int x,int y){ ++idx; ver[idx]=y,nxt[idx]=head[x],head[x]=idx; } int cn,cm; bool vis[N]; void dfs(int u){ vis[u]=1; cm+=degree[u]; for(int i=head[u];~i;i=nxt[i]){ int v=ver[i]; if(vis[v]){ continue; } ++cn; dfs(v); } } signed main(){ memset(head,-1,sizeof head); cin>>n>>m; for(int i=1,x,y;i<=m;++i){ cin>>x>>y; add(x,y),add(y,x); ++degree[x],++degree[y]; } int ans=1; for(int i=1;i<=n;++i){ if(!vis[i]){ cn=1,cm=0; dfs(i);cm>>=1; if(cn==cm){ ans=ans*2%mod; }else if(cn==cm+1){ ans=ans*cn%mod; }else{ cout<<"0\n";return 0; } } }cout<<ans<<"\n"; return 0; }
- 1
信息
- ID
- 256
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 13
- 已通过
- 8
- 上传者