zoukankan      html  css  js  c++  java
  • CF11D-A Simple Task【状压dp】

    正题

    题目链接:https://www.luogu.com.cn/problem/CF11D


    题目大意

    给出(n)个点(m)条边的一张简单无向图,求它的简单环的个数。

    (1leq nleq 19)


    解题思路

    首先算重的问题很麻烦但也是解决这题的关键。

    因为防止算重那么我们就只考虑在每个环编号最小的节点统计一次。

    枚举一个起点,然后后面就只走编号大于其的节点用状压计算方案数即可。

    时间复杂度(O(2^nn^2))


    code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    using namespace std;
    const ll N=19;
    ll n,m,f[N][1<<N],ans;
    bool a[N][N];
    signed main()
    {
    	scanf("%lld%lld",&n,&m);
    	for(ll i=1,x,y;i<=m;i++){
    		scanf("%lld%lld",&x,&y);x--;y--;
    		a[x][y]=a[y][x]=1;
    	}
    	ll MS=(1<<n),pre=0;
    	for(ll p=0;p<n;p++){
    		pre|=(1<<p);
    		for(ll s=0;s<MS;s++){
    			if(s&pre)continue;
    			for(ll i=0;i<n;i++)f[i][s]=0;
    		}
    		f[p][0]=1;
    		for(ll s=0;s<MS;s++){
    			if(s&pre)continue;
    			for(ll i=p;i<n;i++){
    				if(!f[i][s])continue;
    				for(ll j=p+1;j<n;j++){
    					if((s>>j)&1)continue;
    					if(a[i][j])f[j][s|(1<<j)]+=f[i][s];
    				}
    				if(a[i][p]&&s!=(s&-s))
    					ans+=f[i][s];
    			}
    		}
    	}
    	printf("%lld
    ",ans/2);
    	return 0;
    }
    
  • 相关阅读:
    vue--一些预设属性
    vue--vux框架的使用
    vue--vConsole
    vue--音乐播放器
    vue--使用vue-cli构建项目
    vue--实例化对象
    vue--数据显示模版上
    CSS--交互效果
    Git SSH公钥配置
    gradle配置国内镜像
  • 原文地址:https://www.cnblogs.com/QuantAsk/p/15179476.html
Copyright © 2011-2022 走看看