[CF906C]Party
程序员文章站
2024-01-08 22:45:52
1h左右。...
题目
题意概要
“团”的定义是,该子图为完全图。现有 点 边无向图,每次选择一个点,使得其周围的点形成一个“团”。即,任意两个与该点相邻的点,连上一条边。问最少操作多少次,使得整张图为完全图。
数据范围与提示
,无重边、自环。
思路
不难发现过程大概是这样的:选择一个点以后,对于一个包含该点的“团”,加入与该点相邻的点。一开始有很多个“团”,然后在不断的操作中变大(或者多个团合成了一个团),最终包含整张图。
我们是否可以只追踪这一个“团”的变化呢?是可以的。这里给出一种证明方式。我们本来要操作“团”中的一个点,以此加入与其相邻的点。如若它相邻的点变多了,那一定是一个与其相邻的点先被操作。
画一个图,更好理解。
x-----y
\ /
\ /
z
我们原先要操作 ,其时 不相连,但是操作 使得 相连。这样做是否有合理之处?
完全可以更改为先操作 再操作 。先操作 时, 加入了“团”,然后操作 就使 加入了“团”。跟先操作 的效果是一样的。所以,我们先操作 ,也存在一种方式得到最优解。
思路已经出现。用 表示, 集合中的点形成“团”所需最小操作次数。建议刷表法,枚举进行一次何种操作。输出方案存前驱即可。复杂度 。
求“团”怎么求?若 ,则 是“团”的充要条件是, 是“团”, 中任意一个点都与 相连。怎么判断是否 中每个点都与 相连?咱不是用状压的邻接矩阵吗,难道这都做不到?
代码
不想写极大值 。利用每个点最多操作一次的性质,得出答案最大为 。实际上应该是 ,在一条链的情况下。然后用 当了 初值。
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
inline int readint(){
int a = 0; char c = getchar(), f = 1;
for(; c<'0'||c>'9'; c=getchar())
if(c == '-') f = -f;
for(; '0'<=c&&c<='9'; c=getchar())
a = (a<<3)+(a<<1)+(c^48);
return a*f;
}
const int MaxN = 22;
int dp[1<<MaxN], g[1<<MaxN];
int pre[1<<MaxN], ans[1<<MaxN]; // 还原方案
void paint(int S){
if(dp[S] == 0) return ; // 生而为人 我很抱歉
paint(pre[S]), printf("%d ",ans[S]+1);
}
int main(){
int n = readint(), m = readint();
for(int i=1,a,b; i<=m; ++i){
a = readint()-1, b = readint()-1;
g[a] ^= 1<<b, g[b] ^= 1<<a;
}
for(int S=1; S<(1<<n); ++S){
dp[S] = n+1; // 极大值
for(int i=0; i<n; ++i)
if(S>>i&1){
int S_ = S^(1<<i);
if((S_&g[i]) == S_)
dp[S] = dp[S_];
break; // 小剪枝
}
}
for(int S=1; S<(1<<n); ++S)
for(int i=0; i<n; ++i) if(S>>i&1)
if(dp[S|g[i]] > dp[S]+1){
dp[S|g[i]] = dp[S]+1;
pre[S|g[i]] = S, ans[S|g[i]] = i;
}
printf("%d\n",dp[(1<<n)-1]);
paint((1<<n)-1);
return 0;
}
本文地址:https://blog.csdn.net/qq_42101694/article/details/107892185
推荐阅读
-
CodeIgniter辅助之第三方类库third_party用法分析,codeigniter类库_PHP教程
-
[CF906C]Party
-
CodeIgniter辅助之第三方类库third_party用法分析,codeigniter类库_PHP教程
-
CodeIgniter辅助之第三方类库third_party用法分析_php实例
-
只为充电而生 罗马仕七周年店庆狂欢Party
-
CodeIgniter辅助之第三方类库third_party用法分析
-
react-native 在新版Xcode(10+)中运行出现的问题: node_modules/react-native/third-party/glog-0.3.4 , C compiler cannot create executables
-
ps制作酷炫的音乐party海报
-
小米CC9 Pro获DxO总分第一 相机部开party庆祝
-
HDU5437 Alisha’s Party(优先队列+模拟)