状态压缩 HDU 3091

时间:2022-12-29 15:09:36

多组数据

n个点m条边

求有几个经过所有的点的环

最好用__int64

#include<stdio.h>
#include<algorithm>
#include<string.h> using namespace std;
typedef __int64 LL; #define MAXN 1<<18 bool x[][];
LL dp[MAXN][]; void solve(int n)
{
int en=(<<n);
dp[][]=;
for(int i=;i<en;i++)
{
for(int j=;j<n;j++)
{
if(dp[i][j])
{
for(int k=;k<n;k++)
{
if((!(i&(<<k)))&&x[j][k])
dp[i|(<<k)][k]+=dp[i][j];
}
}
}
}
LL ans=;
en--;
for(int i=;i<n;i++)
if(x[][i])
ans+=dp[en][i];
printf("%I64d\n",ans);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(dp,,sizeof(dp));
memset(x,,sizeof(x));
for(int i=;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
u--;
v--;
x[u][v]=;
x[v][u]=;
}
solve(n);
}
return ;
}