多组数据
n个点m条边
求有几个经过所有的点的环
最好用__int64
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; typedef __int64 LL; #define MAXN 1<<18 bool x[20][20]; LL dp[MAXN][20]; void solve(int n) { int en=(1<<n); dp[1][0]=1; for(int i=1;i<en;i++) { for(int j=0;j<n;j++) { if(dp[i][j]) { for(int k=1;k<n;k++) { if((!(i&(1<<k)))&&x[j][k]) dp[i|(1<<k)][k]+=dp[i][j]; } } } } LL ans=0; en--; for(int i=1;i<n;i++) if(x[0][i]) ans+=dp[en][i]; printf("%I64d ",ans); } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { memset(dp,0,sizeof(dp)); memset(x,0,sizeof(x)); for(int i=0;i<m;i++) { int u,v; scanf("%d%d",&u,&v); u--; v--; x[u][v]=1; x[v][u]=1; } solve(n); } return 0; }