分析:每个连通块都是独立的,对一个连通块进行分析.如果边数>点数,显然是不可能的,因为每条边要分配给一个点,至少有一个点分配了两次以上.如果边数=点数,就形成了环,有两种方案,顺时针一个环,逆时针一个环.如果边数=点数-1,形成了链,将n个点分配n-1条边,答案为C(n,n-1),也就是n,统计一下每个连通块有多少个点,多少条边就可以了.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = , mod = 1e9 + ; int n, m, cnt1, cnt2, head[maxn], to[maxn], nextt[maxn], tot = ;
bool vis[maxn], vis2[maxn];
long long ans = ; void add(int x, int y)
{
to[tot] = y;
nextt[tot] = head[x];
head[x] = tot++;
} void dfs(int u)
{
vis[u] = ;
cnt1++;
for (int i = head[u]; i; i = nextt[i])
{
int t = i, t2;
if (t % == )
t2 = i - ;
else
t2 = i + ;
if (!vis2[i])
{
cnt2++;
vis2[t] = vis2[t2] = ;
}
int v = to[i];
if (!vis[v])
dfs(v);
}
} int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= m; i++)
{
int u, v;
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
for (int i = ; i <= n; i++)
{
if (!vis[i])
{
cnt1 = ;
cnt2 = ;
dfs(i);
if (cnt1 == cnt2)
{
if (ans == )
ans = ;
else
ans = (ans * ) % mod;
}
if (cnt1 == cnt2 + )
{
if (ans == )
ans = cnt1;
else
ans = (ans * cnt1) % mod;
}
}
}
printf("%lld\n", ans); return ;
}

最新文章

  1. Linux下 JDK安装
  2. hdu 2222 Keywords Search
  3. ios json parse
  4. wxPython_Phoenix在线安装
  5. JAVA 线程池, 多线程
  6. ASP.NET MVC ViewData/ViewBag 简单小结
  7. android view的setVisibility方法值的意思
  8. Object之魔术函数__toString() 直接输出对象引用时自动调用
  9. ubuntu开机黑屏
  10. 【转】CxImage图像库的使用
  11. Java基础之路(三)下--流程控制语句
  12. CSS预编译与PostCSS以及Webpack构建CSS综合方案
  13. 统计分析与R软件-chapter2-2
  14. Codeforces 725E Too Much Money (看题解)
  15. vue的中vuex为何需要mutation更新状态,vue-router的路由的理解
  16. javascript函数嵌套时arguments的问题
  17. Linux常用基本命令:三剑客命令之-awk输入输出分隔符
  18. yum安装VirtualBox
  19. Minimum number of steps 805D
  20. visio开发者图形分类个人爱好

热门文章

  1. 215 Kth Largest Element in an Array 数组中的第K个最大元素
  2. 自学 iOS - 三十天三十个 Swift 项目 第二天
  3. 跨库导表数据(sql)
  4. Android 图片文件和Bitmap之间的转换
  5. 开发小Tips
  6. MVC 附件在线预览
  7. centOS linux 下PHP编译安装详解
  8. 洛谷——P2680 运输计划
  9. scrapy 请求传参
  10. 输入一个字符串输出ASCII的十六进制值