AtCoder Beginner Contest 187 F - Close Group
题目链接
题目大意
给你一张完全图,你可以删除任意数量的边
要求删除完后剩余的所有子图必须是完全图
问完全子图数量最少是多少
解题思路
定义 \(ok[i]\) 表示状态为 \(i\) 时所对应的点构成的图是否为完全图 (\(1\) 为是 , \(0\) 为否)
判断完全图可直接暴力枚举任意两点检查是否有边
定义 \(dp[i]\) 表示状态为 \(i\) 时所对应的点构成的所有子图都为完全图,且子图数最小
其中 \(dp[0] = 0\)
那么不难得到当 \(ok[j] = 1\) 时
\(dp[i] = min(dp[i] , dp[i\) ^\(j] + 1)\) , ( \(j\) 为 \(i\) 的子集 )
答案为 \(dp[1 << n - 1]\)
AC_Code
#include<bits/stdc++.h>
using namespace std;
const int N = 1LL << 19 , M = 20;
int n , m , dp[N] , ok[N] , g[M][M];
signed main()
{
cin >> n >> m;
for(int i = 1 ; i <= m ; i ++)
{
int x , y;
cin >> x >> y;
g[x][y] = g[y][x] = 1;
}
int sum = 1 << n;
for(int i = 0 ; i < sum ; i ++)
{
ok[i] = 1;
for(int j = 1 ; j <= n ; j ++) if(i >> (j - 1) & 1)
{
for(int k = j + 1 ; k <= n ; k ++) if(i >> (k - 1) & 1)
{
if(!g[j][k]) { ok[i] = 0 ; break ; }
}
if(!ok[i]) break ;
}
dp[i] = 1e9;
}
dp[0] = 0;
for(int i = 0 ; i < sum ; i ++)
{
for(int j = i ; j ; j = (j - 1) & i) if(ok[j])
{
dp[i] = min(dp[i] , dp[i ^ j] + 1);
}
}
cout << dp[sum - 1] << '\n';
return 0;
}
AtCoder Beginner Contest 187 F - Close Group的更多相关文章
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 187
A Large Digits int n; int main() { IOS; int a, b, resa = 0, resb = 0; cin >> a >> b; whi ...
- AtCoder Beginner Contest 261 F // 树状数组
题目链接:F - Sorting Color Balls (atcoder.jp) 题意: 有n个球,球有颜色和数字.对相邻的两球进行交换时,若颜色不同,需要花费1的代价.求将球排成数字不降的顺序,所 ...
- AtCoder Beginner Contest 260 F - Find 4-cycle
题目传送门:F - Find 4-cycle (atcoder.jp) 题意: 给定一个无向图,其包含了S.T两个独立点集(即S.T内部间的任意两点之间不存在边),再给出图中的M条边(S中的点与T中的 ...
- AtCoder Beginner Contest 253 F - Operations on a Matrix // 树状数组
题目传送门:F - Operations on a Matrix (atcoder.jp) 题意: 给一个N*M大小的零矩阵,以及Q次操作.操作1(l,r,x):对于 [l,r] 区间内的每列都加上x ...
- AtCoder Beginner Contest 249 F - Ignore Operations // 贪心 + 大根堆
传送门:F - Keep Connect (atcoder.jp) 题意: 给定长度为N的操作(ti,yi). 给定初值为0的x,对其进行操作:当t为1时,将x替换为y:当t为2时,将x加上y. 最多 ...
- AtCoder Beginner Contest 247 F - Cards // dp + 并查集
原题链接:F - Cards (atcoder.jp) 题意: 给定N张牌,每张牌正反面各有一个数,所有牌的正面.反面分别构成大小为N的排列P,Q. 求有多少种摆放方式,使得N张牌朝上的数字构成一个1 ...
- AtCoder Beginner Contest 133 F Colorful Tree
Colorful Tree 思路: 如果强制在线的化可以用树链剖分. 但这道题不强制在线,那么就可以将询问进行差分,最后dfs时再计算每个答案的修改值, 只要维护两个数组就可以了,分别表示根节点到当前 ...
- AtCoder Beginner Contest 171-175 F
171 F - Strivore 直接把初始字符当成隔板,统计的方案数会有重复 为了避免重复情况,规定隔板字母尽可能最后出现,即在隔板字母后面不能插入含隔板字母的字符串 所以在隔板字母后插入的字符只有 ...
随机推荐
- 建立windows认证模式下的用户登录
第一步:点击控制面板-----管理工具------计算机管理 ,在操作系统的计算机管理界面下,展开本地用户和组,在用户下建立三个用户u1,u2,u3,密码与用户名相同,如图所示. 然后新建一个组叫QQ ...
- SQL Server常用函数及命令
1.字符串函数 --ascii函数,返回字符串最左侧字符的ascii码值 SELECT ASCII('a') AS asciistr --ascii代码转换函数,返回指定ascii值对应的字符 SEL ...
- Linux内核源码分析之setup_arch (二)
1. 概述 接着上一篇<Linux内核源码分析之setup_arch (一)>继续分析,本文首先分析arm_memblock_init函数,然后分析内核启动阶段的是如何进行内存管理的. 2 ...
- js已知A,B两点坐标,在线段AB上有C点,已知AC的距离,求C点的坐标
/** * @param {Number} _x1 A点坐标 * @param {Number} _y1 A点坐标 * @param {Number} _x2 B点坐标 * @param {Numbe ...
- selenium 淘宝商品分页
通过这行代码确定每页的下一页,因为从淘宝的第4页 xpath就匹配不出下一页的位置#这是面向对象写法,不用的把self. 去掉即可next_button = self.driver.find_elem ...
- APIO2020 交换城市
我是真的不稳定的垃圾选手. 对于一张图来说,两个人能满足题面关系等价于这张图不是链,很好证明,如果有度数 \(> 2\) 的点,让一个人跑到一个度数 \(= 1\) 的地方就可以了. 如果离线就 ...
- 【题解】CIRU - The area of the union of circles [SP8073] \ 圆的面积并 [Bzoj2178]
[题解]CIRU - The area of the union of circles [SP8073] \ 圆的面积并 [Bzoj2178] 传送门: \(\text{CIRU - The area ...
- 在DLL中使用对话框
在 DLL 中使用对话框资源与在 EXE 中使用是有所区别的,处理不当便会造成断言失败.原因是因为 CDialog::Create 与 CreateEx 默认使用当前进程中的资源(Dialog Tem ...
- redis学习之——五大基本数据类型
redis 键 (key) 基本数据类型:string 字符串 list (列表) set(集合) hash(类似java 中的Map) zset(有序集合) 官方命令doc redis 键 ...
- java中对象的简单解读
对象=属性(int double之类都是变量的属性)+方法(想要实现内容,所做的一套算法) 属性=变量的所有数据 方法(c语言中叫做函数)=算法 总而言之 对象就是 给他所需要的的数据-->& ...