BZOJ3149 CTSC2013 复原 搜索
\(N \leq 20\)很适合暴搜……
第二问最大独立集裸题,\(O(2^NN)\)的算法都能过……
考虑第一问,使用搜索寻找可行解
每一次枚举一条弦的两个端点,通过位运算计算与其相交的弦的数量进行剪枝
一些其他的剪枝:
①两个非\(0\)值中间的所有\(0\)的地位是一样的,所以可以将这些\(0\)缩成一个\(0\)
②每一个连通块分别考虑,可以避免大量的重复情况
#include<bits/stdc++.h>
//This code is written by Itst
using namespace std;
inline int read(){
int a = 0;
char c = getchar();
bool f = 0;
while(!isdigit(c) && c != EOF){
if(c == '-')
f = 1;
c = getchar();
}
if(c == EOF)
exit(0);
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return f ? -a : a;
}
bitset < 23 > Edge[23] , cur , ans;
int arr[41] , ansArr[41] , times[21] , ind[21] , N , M , len , cntInd , cntA;
bool vis[41];
queue < int > q;
bool dfs1(int x){
if(x > cntInd)
return 1;
bitset < 23 > tmp;
for(int i = 1 ; i < x ; ++i)
tmp |= 1 << ind[i];
++len;
for(int i = len ; i > 1 ; --i)
arr[i] = arr[i - 1];
for(int i = 1 ; i <= len ; ++i){
arr[i] = ind[x];
++len;
for(int j = len ; j > i + 1 ; --j)
arr[j] = arr[j - 1];
bitset < 23 > p;
p.set();
for(int j = i + 1 ; j <= len ; ++j){
arr[j] = ind[x];
if((p & tmp) == (Edge[ind[x]] & tmp) && dfs1(x + 1))
return 1;
arr[j] = arr[j + 1];
p[arr[j]] = p[arr[j]] ^ 1;
}
--len;
arr[i] = arr[i + 1];
}
--len;
return 0;
}
void dfs2(int x){
if(cur.count() + x <= ans.count())
return;
if(!x)
ans = cur;
if((Edge[x] & cur) == cur){
cur.set(x);
dfs2(x - 1);
cur.reset(x);
}
dfs2(x - 1);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
freopen("out","w",stdout);
#endif
N = read();
M = read();
for(int i = 1 ; i <= N ; ++i){
Edge[i].set();
ind[i] = i;
}
for(int i = 1 ; i <= M ; ++i){
int a = read() , b = read();
Edge[a][b] = Edge[b][a] = 0;
}
for(int i = 1 ; i <= N ; ++i)
if(!vis[i]){
vis[i] = 1;
q.push(i);
ind[cntInd = 1] = i;
while(!q.empty()){
int t = q.front();
q.pop();
for(int j = 1 ; j <= N ; ++j)
if(!vis[j] && !Edge[t][j]){
vis[j] = 1;
q.push(j);
ind[++cntInd] = j;
}
}
memset(arr , 0 , sizeof(arr));
if(dfs1(1))
for(int j = 1 ; j <= cntInd * 2 ; ++j)
ansArr[++cntA] = arr[j];
}
for(int i = 1 ; i <= N * 2 ; ++i)
cout << ansArr[i] << ' ';
cout << endl;
cur.reset();
dfs2(N);
cout << ans.count();
return 0;
}
BZOJ3149 CTSC2013 复原 搜索的更多相关文章
- 3149: [Ctsc2013]复原
3149: [Ctsc2013]复原 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 95 Solved: 44[ ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [LeetCode] Restore IP Addresses 复原IP地址
Given a string containing only digits, restore it by returning all possible valid IP address combina ...
- 程设大作业xjb写——魔方复原
鸽了那么久总算期中过[爆]去[炸]了...该是时候写写大作业了 [总不能丢给他们不会写的来做吧 一.三阶魔方的几个基本定义 ↑就像这样,可以定义面的称呼:上U下D左L右R前F后B UD之间的叫E,LR ...
- hdu 5535 Cake 构造+记忆化搜索
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 题意:给定n与m,其中1<= n <= 1e5,2 <= m <= 10;问 ...
- acm位运算应用 搜索
acm位运算应用 搜索 搜索 此处不讲题目,只讲位运算是怎样在这些题中实现和应用的.由于搜索题往往是基于对状态的操作,位运算往往特别有效,优化之后的效果可以有目共睹. 例1.POJ 132 ...
- HDU-1428(记忆化搜索)
Problem Description LL 最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于长时间坐在电脑边,缺乏运动.他决定充分利用每次从寝室到机房的时间,在校园里散散步.整个HDU 校园呈方 ...
- POJ 1321 棋盘问题(DFS板子题,简单搜索练习)
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44012 Accepted: 21375 Descriptio ...
- 力扣算法题—093复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135", ...
随机推荐
- 安卓开发中strings.xml的使用
为了使用方便也是为了代码规范化,我们都将文字信息放在res-values-strings.xml中, 因为开发中需要用到将文字的换行,百度了一下,可以将文字段信息直接在strings.xml文件中换行 ...
- 《数据库系统概念》4-DDL、集合运算、嵌套子查询
一.DDLa) SQL Data DefinitionSQL的基本数据类型有char(n).varchar(n).int.smallint.numeric(p,d).real,double preci ...
- (网页)readonly和disabled的区别(转)
转自脚本之家: 标签的readonly和disabled属性的区别: 在表单元素中,readonly和disable有类似之处,因为它们都可以将一些表单元素设置为"不可用"状态,当 ...
- [20180806]tune2fs调整保留块百分比.txt
[20180806]tune2fs调整保留块百分比.txt --//生产系统一台dg磁盘空间满了.我前一阵子已经将*convert参数修改,增加磁盘,但是这个分区里面的数据文件还可以增长,这样依旧存- ...
- SOAP REST
SOAP是基于RPC原理,是传统程序的函数调用和返回在RPC中被请求和应答代替了而已. SOAP Simple Object Access Protocol,是一种严格定义的信息交换协议,用于在web ...
- MySQL重做日志相关
Ⅰ.事务的实现 这里我们先抛出答案,通过答案再展开分析 特性 实现 A(原子性) redo C(一致性) undo I(隔离性) lock D(持久性) redo/undo 本节针对redo展开分 ...
- 进程间通信——LINUX
1.编写一段程序,使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进 程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill( )向 ...
- Matplotlib:plt.text()给图形添加数据标签
1.数据可视化呈现的最基础图形就是:柱状图.水平条形图.折线图等等: 在python的matplotlib库中分别可用bar.barh.plot函数来构建它们,再使用xticks与yticks(设置坐 ...
- 添加RPMfusion仓库
先添加epel Fedora的意识形态很是严谨,它不会自带任何非自由组件.官方仓库不会提供一些包含有非自由组件的基本软件,比如像多媒体编码.因此,安装一些第三方仓库很有必要,这些仓库会为我们提供一些基 ...
- win10锁屏或睡眠一段时间后弹不出登录框
win10锁屏或睡眠一段时间后弹不出登录框 文:铁乐与猫 通常发生在win10更新到10周年版后发生,也就是会卡在登录状态,但不见输入登录框. 我出现这种情况的时候不是很严重,一般等久些也能出现,但问 ...