CodeForces - 11D 【状压DP+无向图找环】

   CF11D 链接 

   题意:求出一个n个点m个边的图,求简单环有多少(没有重复点和边)。(n<20)

  分析:用S能记录状态(有多少个点在路径中),那么如何找环能确保不重不漏啦,对于一个环,找出他的特异性记录,一个环,如果以最小点为环的“起始点”,则每个环都被记录啦两次。用dp[s][i]表示路径s的当前点为i的次数,枚举下一点,如果形成环就加上答案,否则记录下一边。由于题目求的是超过三个点的简单环,而之前所求两个点也会被记录。减掉就可以啦。

#include
#include
#include
#include
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long LL;
const int N=1<<24;
int a[33],b[33],n,dp[N+10],pre[N+10],g[33][33],ans[333];
int len(int x,int y)
{
    return x*x+y*y;
}
int main()
{
    while(scanf("%d%d",&a[0],&b[0])!=EOF)
    {
        scanf("%d",&n);
        a[n]=a[0];b[n]=b[0];
        for(int i=0;iret)
                {
                    dp[st]=ret;
                    pre[st]=s;
                }
                for(int j=i+1;jret)
                    {
                        dp[st]=ret;
                        pre[st]=s;
                    }

                }
                break;
            }
        }
        int from=t-1,to=pre[t-1];
        int tot=0;
        ans[0]=0;
        while(from)
        {
            int tem=from-to;
            for(int i=0;i


你可能感兴趣的:(【动态规划】-状压DP)