【NOIP2017模擬賽】二分圖+狀態壓縮DP Graph(好題)
阿新 • • 發佈:2019-01-09
題解
這道題其實是一個
此時我們考慮狀態壓縮DP, =i
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 25
#define mod 998244353
#define P 1048580
int n,m,lg2[P],bit[P];
bool A[N][N];
int f[N][P];
int getint()
{
int p=0;
char c=getchar();
while (c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')p=p*10+c-'0',c=getchar();
return p;
}
int main()
{
n=getint();m=getint();
lg2[1]=1;bit[1]=1;
for(int i=2;i<=(1<<20);i++)
{
lg2[i]=lg2[i>>1]+1;
for(int j=0;j<=20;j++)
if(i&(1 <<j))
bit[i]++;
}
for(int i=1;i<=m;i++)
{
int a=getint(),b=getint();
A[a][b]=1;
}
f[0][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<(1<<n);j++)
{
if(bit[j]!=i)
continue;
for(int k=j;k;k-=k&-k)
{
int v=lg2[k&-k];
if(A[i][v])
f[i][j]=(f[i][j]+f[i-1][j-(k&-k)])%mod;
}
}
}
printf("%d\n",f[n][(1<<n)-1]);
}