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", ...
随机推荐
- python之操作系统介绍,进程的创建
操作系统(英语:operating system,缩写作 OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石.操作系统需要处理如管理与配置内存.决定系统资源供需的优先次序.控 ...
- QQ浏览器兼容模式问题
今天客户反馈有个问题,他说用360浏览器的兼容模式无法登陆系统,我试了可以,接着试了IE11,也可以,然后跟经理汇报,他说他用qq浏览器兼容模式就不可以,于是我试了,果然不可以... 问题是酱紫的:输 ...
- RabbitMQ延迟消息学习
准备做一个禁言自动解除的功能,立马想到了订单的超时自动解除,刚好最近在看RabbitMQ的实现,于是想用它实现,查询了相关文档发现确实可以实现,动手编写了这篇短文. 准备工作 1.Erlang安装请参 ...
- Linksys EA6500刷ddwrt成功记
网上刷Linksys EA6500的资料不多,然后又绕了好多个弯子,自己记录备忘. 首先EA6500有两个版本v1和v2,对应的固件不同. 区分方法: 1.v1的背后是两个颜色一样的usb2.0 2. ...
- LCD显示异常分析——撕裂(tear effect)【转】
转自:LCD显示异常分析--撕裂(tear effect) 概述 在上一篇<LCD显示异常分析--开机闪现花屏>中,我们一起分析了开机花屏的问题,在这一篇中,我将对LCD撕裂(tear e ...
- python 机器学习中模型评估和调参
在做数据处理时,需要用到不同的手法,如特征标准化,主成分分析,等等会重复用到某些参数,sklearn中提供了管道,可以一次性的解决该问题 先展示先通常的做法 import pandas as pd f ...
- .NET Core launch.json 简介
1.环境 Windows,.NET Core 2.0,VS Code dotnet> dotnet new console -o myApp 2.launch.json配置文件 { // Use ...
- 查看tomcat项目中,具体占用cpu高的线程。
1.查看主进程占用cpu高: 此处主进程:27823 ~]# top top - :0: up days, :, 3 users, load average: 13.12, 13.31, 13.23 ...
- JDBC学习笔记之JDBC简介
1. 引言 JDBC API是一种Java API,可以访问任何类型的表格数据,特别是存储在关系数据库中的数据. JDBC可以帮助我们编写下列三种编程活动的java应用程序: 1.连接到数据源,如数据 ...
- CefSharp的一些初始化操作
if (!CefSharp.Cef.IsInitialized) { var setting = new CefSharp.CefSettings { Locale = "zh-CN&quo ...