把暗恋关系看成无向边, 那某个点度数超过2就无解。存在环也是无解。有解的话对连通分量进行排列就行了。

----------------------------------------------------------------------------------

#include<cstdio>
#include<algorithm>
#include<cstring>
 
using namespace std;
 
typedef long long ll;
 
const int maxn = 500009;
const int MOD = 989381;
 
pair<int, int> e[maxn << 1];
int N, cnt[maxn], Vn = -1, en = 0, deg[maxn];
bool vis[maxn];
 
struct edge {
int to;
edge* next;
} E[maxn << 1], *pt = E, *head[maxn];
 
void AddEdge(int u, int v) {
deg[pt->to = v]++; pt->next = head[u]; head[u] = pt++;
}
 
void Init() {
memset(vis, 0, sizeof vis);
memset(deg, 0, sizeof deg);
memset(cnt, 0, sizeof cnt);
int m;
scanf("%d%d", &N, &m);
while(m--) {
int u, v;
scanf("%d%d", &u, &v); u--; v--;
e[en++] = make_pair(u, v);
e[en++] = make_pair(v, u);
}
sort(e, e + en);
en = unique(e, e + en) - e;
for(int i = 0; i < en; i++)
AddEdge(e[i].first, e[i].second);
}
 
bool Check() {
for(int i = 0; i < N; i++)
if(deg[i] > 2) return false;
return true;
}
 
bool Dfs(int x, int p) {
if(vis[x]) return true;
vis[x] = true;
cnt[Vn]++;
for(edge* e = head[x]; e; e = e->next)
if(e->to != p && Dfs(e->to, x)) return true;
return false;
}
 
int main() {
Init();
if(!Check()) {
puts("0"); return 0;
}
for(int i = 0; i < N; i++) if(!vis[i]) {
Vn++;
if(Dfs(i, -1)) {
puts("0"); return 0;
}
}
Vn++;
int ans = 1;
for(int i = 2; i <= Vn; i++)
ans = ll(i) * ans % MOD;
for(int i = 0; i < Vn; i++)
if(cnt[i] > 1 && (ans <<= 1) >= MOD) ans -= MOD;
printf("%d\n", ans);
return 0;
}

----------------------------------------------------------------------------------

3444: 最后的晚餐

Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 342  Solved: 128
[Submit][Status][Discuss]

Description

【问题背景】
高三的学长们就要离开学校,各奔东西了。某班n人在举行最后的离别晚餐时,饭店老板觉得十分纠结。因为有m名学生偷偷找他,要求和自己暗恋的同学坐在一起。
【问题描述】
饭店给这些同学提供了一个很长的桌子,除了两头的同学,每一个同学都与两个同学相邻(即坐成一排)。给出所有信息,满足所有人的要求,求安排的方案总数(这个数字可能很大,请输出方案总数取余989381的值,也可能为0)。

Input

输入有m+1行,第一行有两个用空格隔开的正整数n、m,如题所示。接下来的m行,每一行有两个用空格隔开的正整数,第i行为Ai和Bi,表示Ai的暗恋对象为Bi,保证Ai互不相等。

Output

输出只有一行,这一行只有一个数字,如题所示。

Sample Input

4 2
1 2
4 3

Sample Output

8

【数据范围】
100%的数据,0<n≤500000,1≤Ai,Bi≤n,0≤m≤n,保证没有人自恋。

HINT

Source

最新文章

  1. 嵌入式Linux驱动学习之路(十一)按键驱动-中断机制
  2. ant 的详细的入门教程
  3. 水题 Codeforces Round #302 (Div. 2) A Set of Strings
  4. Coco2dx 3D例子
  5. mybatis使用笔记
  6. Swift给每个开发者赢取500万的机会!不看一生后悔。
  7. [Java] SSH框架笔记_S2SH整合步骤
  8. Linux内核的同步机制
  9. ListIterator add remove 使用注意
  10. Java日志终极指南
  11. codeforces 559A(Gerald&#39;s Hexagon)
  12. Linux学习记录--匿名沟通渠道
  13. html自定义调控
  14. LVS实现负载均衡安装配置详解
  15. Python3 tkinter基础 Radiobutton 设置相同的value值,产生连锁效果
  16. springboot实现自定义的错误页面展示
  17. 拿到BAT等大厂offer以后,我发现了关于秋招的一些真相
  18. 【转载】阿里云服务器为网站选配Https证书
  19. JSONCkecker(C语言版本)
  20. SpringBoot之使用Lettuce集成Redis

热门文章

  1. CC++初学者编程教程(1) Visual Stduio2010开发环境搭建
  2. UberX及以上级别车奖励政策(优步北京第一组)
  3. Spring构造器注入、set注入和注解注入
  4. 从零开始学习UNITY3D(GUI篇 GUI.Window)
  5. 异常IllegalStateException终于解决了
  6. English - when用法
  7. T-SQL 查询语句总结
  8. collectionView 中cell间距设置建议
  9. day5_python学习笔记_chapter7_字典
  10. nodejs:注册登录session出错以及连接Mongodb数据库时Error connecting to database解决方案