题目链接:https://codeforces.com/contest/11/problem/D
状压DP 无向图找简单环
还是来自洛谷题解的做法QAQ
#include <iostream>
using namespace std;
static const int MAXN=20;
long long dp[1<<MAXN][MAXN];
//dp[i][j] i表示经过的点的状态 j表示结尾的点
int d[MAXN][MAXN];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
u--,v--;
d[u][v]=d[v][u]=1;
}
for(int i=0;i<n;i++) dp[1<<i][i]=1;
long long ans=0;
for(int i=0;i<1<<n;i++)
for(int j=0;j<n;j++)
if(dp[i][j])
for(int k=0;k<n;k++)
if(d[j][k])
{
if((i&-i)>1<<k) continue;
//假设最低位的1为最小点
if(i>>k&1)
{
if((i&-i)==1<<k) ans+=dp[i][j];
//又回到最初的起点
}
else dp[i|1<<k][k]+=dp[i][j];
}
printf("%lld\n",(ans-m)/2);
//去掉一条边两个点,以及无向图顺时针逆时针的环被重复计算的问题
return 0;
}