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;
}
原创粉丝点击