题目链接:
题目详解:
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 20
using namespace std;
int next_all[maxn]={0};
int pos[1<<maxn];
int dp[maxn][1<<maxn];
int n,ans=0;
int dfs(int loc,int remain)
{
if(dp[loc][remain]!=-1)
return dp[loc][remain];
if(!remain)
return dp[loc][remain]=next_all[loc]&1;
int d=remain&next_all[loc];
dp[loc][remain]=0;
while(d)
{
int v=d&(-d);
int remain2=remain-v;
dp[loc][remain]+=dfs(pos[v],remain-v);
d-=v;
}
return dp[loc][remain];
}
int main()
{
// freopen("in.txt","r",stdin);
int m,a,b;
scanf("%d%d",&n,&m);
memset(dp,-1,sizeof(dp));
for(int i=0;i<n;i++)
pos[1<<i]=i+1;
while(m--)
{
scanf("%d%d",&a,&b);
next_all[a]=next_all[a]|(1<<b-1);
}
dfs(1,(1<<n)-2);
printf("%d\n",dp[1][(1<<n)-2]);
return 0;
}