hdu 3091
细节好多。
注意题目要求的是一个环,所以默认把第0个珠子当成第一个珠子,最后加的时候,最后一颗要和0能够相连。
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int n,m;
int is[30][30];
ll dp[1<<18][20];
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(is,0,sizeof is);
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
x--;
y--;
is[x][y]=is[y][x]=1;
}
memset(dp,0,sizeof dp);
dp[1][0]=1;
for(int i=1;i<(1<<n);i++)
{
for(int j=0;j<n;j++)
{
if(i&(1<<j))
for(int k=1;k<n;k++)
{
if(is[j][k]&&!(i&(1<<k)))
{
dp[i+(1<<k)][k]+=dp[i][j];
}
}
}
}
ll sum=0;
for(int i=1;i<n;i++)
if(is[0][i])
sum+=dp[(1<<n)-1][i];
printf("%lld\n",sum);
}
return 0;
}