bzoj3444(搜索)
来源:互联网 发布:好看的动漫 知乎 编辑:程序博客网 时间:2024/06/16 11:38
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int mod=989381;
const int maxn=500010;
int num1,num2,n,m,s[maxn][3],cnt[maxn],num[maxn],fac[maxn],flag=true,vis[maxn];
void dfs(int x,int y,int z){
if(flag==false) return;
vis[x]=true;
if(z==0){
++num1;
if(s[x][1]){
if(vis[s[x][1]]){
flag=false; return ;
}
num[s[x][1]]++; num2--; dfs(s[x][1],x,1);
}
if(s[x][2]){
if(vis[s[x][2]]){
flag=false; return ;
}
num[s[x][2]]++; --num2; dfs(s[x][2],x,2);
}
}
else{
if(z==1){
if(cnt[x]==2){
num[s[x][1]]++; num[s[x][2]]++;
if(s[x][1]!=y&&s[x][2]!=y){
flag=false; return;
}
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return;
}
num2--;
dfs(s[x][1],x,1);
}
if(s[x][2]!=y){
if(vis[s[x][2]]){
flag=false; return ;
}
num2--; dfs(s[x][2],x,1);
}
}
if(cnt[x]==1){
num[s[x][1]]++;
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return ;
}
else{
dfs(s[x][1],x,1);
}
}
}
}
else{
if(cnt[x]==2){
num[s[x][1]]++; num[s[x][2]]++;
if(s[x][1]!=y&&s[x][2]!=y){
flag=false; return;
}
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return;
}
num2--;
dfs(s[x][1],x,2);
}
if(s[x][2]!=y){
if(vis[s[x][2]]){
flag=false; return ;
}
num2--; dfs(s[x][2],x,2);
}
}
if(cnt[x]==1){
num[s[x][1]]++;
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return ;
}
else{
dfs(s[x][1],x,2);
}
}
}
}
}
if(flag==false) return;
}
int main(){
scanf("%d%d",&n,&m);
int x,y;
for(int i=1;i<=m;i++){
int a,b; scanf("%d%d",&a,&b);
s[a][++cnt[a]]=b;
}
fac[0]=1;
for(int i=1;i<=n;i++){
fac[i]=fac[i-1]*i%mod;
}
num2=n;
for(int i=1;i<=n;i++) if(cnt[i]>2){
cout<<0<<endl; return 0;
}
for(int i=1;i<=n;i++){
if(cnt[i]!=0&&!vis[i]){
dfs(i,0,0);
if(flag==false){
cout<<0<<endl; return 0;
}
}
}
for(int i=1;i<=n;i++){
if(num[i]>2){
cout<<0<<endl;
return 0;
}
}
long long ans=fac[num2+num1];
//cout<<num2<<endl<<num1<<endl;
for(int i=1;i<=num1;i++) ans=(ans%mod*2)%mod;
cout<<ans<<endl;
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int mod=989381;
const int maxn=500010;
int num1,num2,n,m,s[maxn][3],cnt[maxn],num[maxn],fac[maxn],flag=true,vis[maxn];
void dfs(int x,int y,int z){
if(flag==false) return;
vis[x]=true;
if(z==0){
++num1;
if(s[x][1]){
if(vis[s[x][1]]){
flag=false; return ;
}
num[s[x][1]]++; num2--; dfs(s[x][1],x,1);
}
if(s[x][2]){
if(vis[s[x][2]]){
flag=false; return ;
}
num[s[x][2]]++; --num2; dfs(s[x][2],x,2);
}
}
else{
if(z==1){
if(cnt[x]==2){
num[s[x][1]]++; num[s[x][2]]++;
if(s[x][1]!=y&&s[x][2]!=y){
flag=false; return;
}
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return;
}
num2--;
dfs(s[x][1],x,1);
}
if(s[x][2]!=y){
if(vis[s[x][2]]){
flag=false; return ;
}
num2--; dfs(s[x][2],x,1);
}
}
if(cnt[x]==1){
num[s[x][1]]++;
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return ;
}
else{
dfs(s[x][1],x,1);
}
}
}
}
else{
if(cnt[x]==2){
num[s[x][1]]++; num[s[x][2]]++;
if(s[x][1]!=y&&s[x][2]!=y){
flag=false; return;
}
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return;
}
num2--;
dfs(s[x][1],x,2);
}
if(s[x][2]!=y){
if(vis[s[x][2]]){
flag=false; return ;
}
num2--; dfs(s[x][2],x,2);
}
}
if(cnt[x]==1){
num[s[x][1]]++;
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return ;
}
else{
dfs(s[x][1],x,2);
}
}
}
}
}
if(flag==false) return;
}
int main(){
scanf("%d%d",&n,&m);
int x,y;
for(int i=1;i<=m;i++){
int a,b; scanf("%d%d",&a,&b);
s[a][++cnt[a]]=b;
}
fac[0]=1;
for(int i=1;i<=n;i++){
fac[i]=fac[i-1]*i%mod;
}
num2=n;
for(int i=1;i<=n;i++) if(cnt[i]>2){
cout<<0<<endl; return 0;
}
for(int i=1;i<=n;i++){
if(cnt[i]!=0&&!vis[i]){
dfs(i,0,0);
if(flag==false){
cout<<0<<endl; return 0;
}
}
}
for(int i=1;i<=n;i++){
if(num[i]>2){
cout<<0<<endl;
return 0;
}
}
long long ans=fac[num2+num1];
//cout<<num2<<endl<<num1<<endl;
for(int i=1;i<=num1;i++) ans=(ans%mod*2)%mod;
cout<<ans<<endl;
return 0;
}
阅读全文
0 0
- bzoj3444(搜索)
- BZOJ3444: 最后的晚餐
- BZOJ3444 最后的晚餐
- bzoj3444: 最后的晚餐
- 【bzoj3444】最后的晚餐 乱搞
- 【bzoj3444】【最后的晚餐】【组合数学】
- 搜索之广度搜索【迷宫搜索】(输出一条路径)
- 百度地图(二)全城搜索,详情搜索,附近搜索
- 数组搜索(search)之线性搜索与二分法搜索
- SharePoint2010 搜索(2) 简单的搜索
- 二分搜索(折半搜索)的实现
- 记忆化搜索(搜索+dp思想)
- Android搜索建议(搜索联想)
- 搜索算法-二分搜索(折半查找)
- 搜索(广度优先搜索) BFS 1
- 搜索(广度优先搜索)BFS 2
- Beam Search(集束搜索/束搜索)
- 图的搜索(深度搜索)
- Redis总结
- uboot中ethernet网口实现分析
- Android Design Support Library使用
- 数据库——sql中的主外键约束及其他常用约束
- Spring MVC Test Framework简译
- bzoj3444(搜索)
- Andrew NG 机器学习 练习6-Support Vector Machines
- Android 二级列表购物车
- 2年Java开发工作经验面试总结
- 初识Nginx
- 搭建FastDFS,Nginx,fastdfs-nginx-module图片资源服务器
- 实验二 链表的基本操作
- 搬走了
- ImageLoader的缓存+PopupWindow的一些使用