Necklace-(狀態壓縮&&位運算)
阿新 • • 發佈:2019-02-04
B - Necklace
#include<iostream> #include<stdio.h> #include<string.h> typedef long long LL; using namespace std; int n,m; int v[20][20]; LL dp[(1<<18)+1][20]; int main() { while(scanf("%d%d",&n,&m)!=EOF) { memset(v,0,sizeof(v)); memset(dp,0,sizeof(dp)); for(int i=1;i<=m;i++) { int l,r; scanf("%d%d",&l,&r); v[l-1][r-1]=1; v[r-1][l-1]=1; } dp[1][0]=1; for(int i=1;i<(1<<n);i++) for(int j=0;j<n;j++){ if(dp[i][j]&&(i&(1<<j))){ for(int k=1;k<n;k++){ if(!(i&(1<<k))&&v[j][k]){ dp[i|(1<<k)][k]+=dp[i][j]; } } } } LL sum=0; for(int i=0;i<n;i++) { if(v[0][i]) { sum+=dp[(1<<n)-1][i]; } } printf("%lld\n",sum); } }