noip模拟赛 少女
2024-08-26 23:27:02
分析:每个连通块都是独立的,对一个连通块进行分析.如果边数>点数,显然是不可能的,因为每条边要分配给一个点,至少有一个点分配了两次以上.如果边数=点数,就形成了环,有两种方案,顺时针一个环,逆时针一个环.如果边数=点数-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 ;
}
最新文章
- Linux下 JDK安装
- hdu 2222 Keywords Search
- ios json parse
- wxPython_Phoenix在线安装
- JAVA 线程池, 多线程
- ASP.NET MVC ViewData/ViewBag 简单小结
- android view的setVisibility方法值的意思
- Object之魔术函数__toString() 直接输出对象引用时自动调用
- ubuntu开机黑屏
- 【转】CxImage图像库的使用
- Java基础之路(三)下--流程控制语句
- CSS预编译与PostCSS以及Webpack构建CSS综合方案
- 统计分析与R软件-chapter2-2
- Codeforces 725E Too Much Money (看题解)
- vue的中vuex为何需要mutation更新状态,vue-router的路由的理解
- javascript函数嵌套时arguments的问题
- Linux常用基本命令:三剑客命令之-awk输入输出分隔符
- yum安装VirtualBox
- Minimum number of steps 805D
- visio开发者图形分类个人爱好