首页 > 其他分享 >Codeforces 11D A Simple Task 题解 [ 蓝 ] [ 状压 dp ]

Codeforces 11D A Simple Task 题解 [ 蓝 ] [ 状压 dp ]

时间:2024-07-31 23:17:39浏览次数:10  
标签:11D Task int 题解 状压 条数 lowbit ans dp

思路不难想,细节比较多。

思路

观察到 \(n \le 19\) ,首先想到状压 dp 。

于是自然地定义 \(dp[j][i]\) 为:抵达点的状态为 \(i\) ,且此时在点 \(j\) 时,简单路径的条数。注意这里是简单路径的条数,而不是环的个数,因为环的个数要在 dp 过程中统计。这里的 dp 作用就在于求简单路径条数

在转移的时候,我们先定下当前状态 \(i\) ,然后选定当前处于哪个点 \(j\) ,最后决定去到哪个点 \(k\) 。与一般的吃奶酪模型不太一样,\(k\) 可以不在 \(i\) 中。

对于 \(k\) 在 \(i\) 中且 \(k\) 为起点的情况,此时重复抵达一个点,这时候我们找到了环,则 \(ans+=dp[j][i]\) 。

对于 \(k\) 不在 \(i\) 中的情况,就要去到 \(k\) 那里,则 \(dp[k][i|(1<<k)]+=dp[j][i]\) 。

因为起点不同,经过的边相同的环视为同一个环,所以我们假定起点为当前状态的 lowbit ,注意在枚举 \(k\) 时我们不能让 \((1<<k)<lowbit(i)\) ,因为如果这样那么我们的起点就改变了,会统计到重复的。

另外,因为我们会把所有的无向边统计进去,所以我们的 \(ans-m\) 。又因为一条环会正着走一遍,反着走一遍,所以要把 \((ans-m)/2\) ,即为最终结果。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
bool g[55][55];
ll dp[20][600000],ans=0;
int lowbit(int x){return x&-x;}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v;
		cin>>u>>v;
		u--,v--;
		g[u][v]=g[v][u]=1;
	}
	for(int i=0;i<n;i++)dp[i][1<<i]=1;
	for(int i=0;i<(1<<n);i++)
	{
		for(int j=0;j<n;j++)
		{
			if(((i>>j)&1)==0)continue;
			for(int k=0;k<n;k++)
			{
				if(!g[j][k]||j==k)continue;
				if(lowbit(i)>(1<<k))continue;// 一定要加特判,防止起点变化
				if((i>>k)&1)
				{
					if(lowbit(i)==(1<<k))ans+=dp[j][i];
				}
				else dp[k][i|(1<<k)]+=dp[j][i];
			}
		}
	}
	cout<<(ans-m)/2;
	return 0;
}

标签:11D,Task,int,题解,状压,条数,lowbit,ans,dp
From: https://www.cnblogs.com/zhr0102/p/18335715

相关文章

  • [JOI 2020 Final] 火事 题解
    给一篇题解。(下面这张图是从luogu上粘贴的,因为不太会画图)其中纵坐标为\(t\),横坐标为\(a_i\)。发现同颜色块只有平行四边形和直角梯形(等腰直角三角形)两种情况。可以将直角梯形削去左下角,分成两部分考虑。等直可以直接暴力插入区间,总个数\(O(n)\)。平行四边形可以看作上......
  • [CF455D] Serega and Fun 题解
    不知道大家做没做过数列分块基础9题?插入删除操作可以用链表,线段树等数据结构都不好维护,考虑分块。对于修改操作,暴力重构受影响块的链表,发现除首尾块外,其他块都可以看作是区间左移一位,所以加头删尾即可。每个块开一个数组(绝对不能是\((un\_)map\),不然你会和我一样死的很诡异),表示......
  • HDU2024 R2 T9 题解
    考虑维护一下每个点的速度。把区间加拆成后缀加和后缀减,然后考虑后缀加。减就同理。考虑在一段后缀的目标速度增加之后,哪些时刻的加速度会变化。这里加速度必然只会变大\(1\),因此在这个时刻之后的速度都会增加\(1\),又由于目标速度也增加了\(1\),所以这个位置之后的加速度都不再......
  • CF455D Serega and Fun 题解
    Beforeit来当一回教练的题解翻译家,平衡树这种高级算法自然是不会的,所以详细讲一下STL。成为蒟蒻(也就是自己)的福音。Solution我们观察到题目要求“把第\(r\)个数插入在第\(l\)个数之前,其他数顺序不变“,使用\(deque\)的\(push\)_\(front\)和\(push\)_$back$操作可......
  • 暗区突围pc端下载失败/卡正在初始化/连接伺服务器失败/问题解决方法
    暗区突围pc端下载失败/卡正在初始化/连接伺服务器失败/问题解决方法暗区突围pc端下载失败/卡正在初始化/连接伺服务器失败/问题解决方法暗区突围也可以在电脑上游玩拉,暗区突围PC端上线在即,本次上线就是全球抢先测试了,很多小伙伴在游戏下载过程中遇到了很多问题,比如:下载失......
  • QOJ6504 Flower‘s Land 2 题解
    QOJ6504Flower'sLand2题解题目链接:QOJ6504Flower'sLand2题意:给定一个只包含\(0,1,2\)的序列,\(T\)次询问,询问有两种:区间所有数加\(1\)然后模\(3\)求一段区间能否通过每次删掉相邻两个相同的数删完(如\(1,0,0,2,2,1\)就满足条件)题解:考虑用什么方法来维护区间......
  • CF1995C Squaring 题解
    思路详解:请注意,本题解用到了非整数计算,也就是说性能可能不如整数运算,但是易于实现,追求最优解的大佬不建议观看本题解。这个题看似简单,但是由于涉及到了平方操作,不用高精度根本存不下,然后如果你要用高精度的话又会T......
  • 关于题解
    这里说一下为什么要在博客园写东西,其实有几个主要原因:首先是我一个朋友写题解的时候,因为多了一个空格被打回。然后我这个朋友就开始在这里写东西了。然后这个朋友找到了一个拿过金牌的学长,他同样之前审过题解,总之他认为只要不是题解写的完全不能看,或者在某些地方有一些事实性错......
  • 平行四边形 题解
    题目id:20306题目描述鱼大大凭借着优秀的语文成绩当上了数学课代表?!鱼大大心想着数学和我语文好也不搭边呀,不过他的数学老师疯狂给鱼大大画饼:只要你当了数学课代表,有很多很多权利的啦......最后数学老师告诉鱼大大,人只要一行行,行行行,这句话在学科上也是一样的,语文学的好,数学也一......
  • 数字检测 题解
    题目id:20317题目描述作为一个学渣的鱼大大在学习了进制数之后,经常会写错进制数,导致他在做题的时候经常出现,写到了最后发现数字是错的情况,非常浪费时间。所以他迫切地想要一位大聪明随时随刻能帮他检测一下他写的\(n\)进制数到底是不是对的。现在鱼大大给出了一个\(n\)进制的数\(......