[POI2008]POD Subdivision of Kingdom
Description
给出一个具有N个结点的无向图,将其分成两个集合S1,S2. 这两个集合的点的个数一样多,但连接它们的边最少.
Input
第一行给出数字N,M,代表有N个点,M条边. 下面M行,每行两个数字代表此两点间有条边.
Output
输出的点集应包含1,且按升序排列
Sample Input
6 8
1 2
1 6
2 3
2 5
2 6
3 4
4 5
5 6
Sample Output
1 2 6
HINT
N<=26
考虑爆搜,带4个参数 len(搜索长度),x(当前搜索到的点),sta(已选择的点的状态),cnt(两个集合之间的边数),但是这样是会T的。时间主要在更新cnt的时候产生了冗余。所以我们把每个点所连的点记为一个状压状态,然后更新cnt的时候减去连边状态中在集合内的点,把不在集合内的点加进来即可。
/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
int x=0,f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return x*f;
}
inline void print(int x){
if (x>=10) print(x/10);
putchar(x%10+'0');
}
const int N=26;
int g[(1<<N/2)+10],d[N+10];
int n,m,S,Min=inf;
int get(int sta){return g[sta&((1<<(n>>1))-1)]+g[sta>>(n>>1)];}//分两半统计答案,节省数组空间
void dfs(int num,int x,int sta,int cnt){
if (num==n>>1){
if (Min>cnt) Min=cnt,S=sta;
return;
}
for (int i=x+1;i<=n;i++) dfs(num+1,i,sta|(1<<(i-1)),cnt-get(sta&d[i])+get(~sta&d[i]));//在集合内和不在集合内
}
int main(){
n=read(),m=read();
for (int i=1;i<=m;i++){
int x=read(),y=read();
d[x]|=1<<(y-1);
d[y]|=1<<(x-1);
}
for (int i=1;i<=1<<(n>>1);i++) g[i]=g[i>>1]+(i&1);//记录每个状态内有多少个点
dfs(1,1,1,get(d[1]));
for (int i=1;i<=n;i++) if (S&(1<<(i-1))) printf("%d ",i);
return 0;
}
[POI2008]POD Subdivision of Kingdom的更多相关文章
- 1130: [POI2008]POD Subdivision of Kingdom
1130: [POI2008]POD Subdivision of Kingdom https://lydsy.com/JudgeOnline/problem.php?id=1130 分析: 有效状态 ...
- bzoj1130:[POI2008]POD Subdivision of Kingdom
传送门 看到数据范围这么小,不由得算了一下暴力复杂度,算出来情况一共只有1e7,不多,再乘上暴力判断的复杂度,好像T了,判断的话位运算可以方便解决 但是我写的优化似乎比较渣,还留了个log,但是还是n ...
- 解题:POI 2008 Subdivision of Kingdom
题面 还可以这么搜......学到了(PoPoQQQ orz) 我们最朴素的做法是枚举所有状态(当然可以剪,剪完最终实际状态量也是$C_{26}^{13}$的),然后每次$O(n)$扫一遍判断,大概会 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [POI2008]POD-Subdivision of Kingdom(搜索+状压)
题意 给定一个n个点的无向图,要求将点集分成大小相等的两个子集,使两个子集之间的边数最少 (n<=26) 题解 一开始想了半天DP发现不会,去看题解全是搜索. 所以发现C(1326)可以过我就写 ...
- pod Spec管理配置
pod Spec 为自己的项目添加pod管理功能.前言: 上一篇文章中提到,因为自己在操作的时候遇到很多坑,所在在此做一个记录,同样也希望可以帮到在这个操作上遇到坑的人. 本文将采用配图和加文字的方式 ...
- iOS pod install update 慢!!!
在终端输入: pod install --verbose --no-repo-update pod update --verbose --no-repo-update
- 使用 pod install 还是 pod update ?
翻译自:https://guides.cocoapods.org/using/pod-install-vs-update.html 介绍: 许多人开始使用CocodPods的时候认为pod insta ...
- CocoaPods pod install
加参数可以提升更新的速度 方法1: pod install --verbose --no-repo-update pod update --verbose --no-repo-update 方法2: ...
随机推荐
- 【Nginx】ngx_event_core_module事件模块
功能:创建连接池,决定使用哪些事件驱动机制,以及初始化将要使用的事件模块 该模块定义了ngx_event_core_commands数组处理其感兴趣的7个配置项 ngx_event_conf_t为该模 ...
- SQL 主机
SQL 主机 SQL 主机 如果您想要您的网站存储数据在数据库并从数据库显示数据,您的 Web 服务器必须能使用 SQL 语言访问数据库系统. 如果您的 Web 服务器托管在互联网服务提供商(ISP, ...
- Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeException
使用MapReduce编写的中文分词程序出现了 Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeExcept ...
- Android 中间人攻击
0x00 Android中间人攻击的思路就是劫持局域网中被攻击机器和server间的对话.被攻击机器和server表面上工作正常,实际上已经被中间人劫持.能够从一张图来明确这个过程. 受攻击主机发送的 ...
- qt之旅-1纯手写Qt界面
通过手写qt代码来认识qt程序的构成,以及特性.设计一个查找对话框.以下是设计过程 1 新建一个empty qt project 2 配置pro文件 HEADERS += \ Find.h QT += ...
- 树莓派的PWM脉宽调制功能介绍
近期想用树莓派控制航模的电调,于是研究了下PWM.貌似控制电调比較麻烦,由于电调须要发送几个特定的信号启动,然后才干进入控制模式.今天先弄明确PWM,慢慢折腾.以下的程序亲測可用,我用的树莓派mode ...
- 用javascript写一个前端等待控件
前端等待控件有啥新奇的?什么jquery啦,第三方控件啦,好多好多,信手拈来. 因为项目使用了bootstrap的原因,不想轻易使用第三方,怕不兼容.自己写一个. 技术点包括动态加载CSS,javas ...
- BootstrapValidator demo
source:http://bv.doc.javake.cn/api/ BootstrapValidator is the best jQuery plugin to validate form fi ...
- VCL代码的一些设计手法(使用OO虚函数的技巧)
1. 抽象类法(VCL不推荐):第一,允许创建抽象类对象,因为语法没问题,但允许其错误.第二,接口更好.第三,如果是混合抽象类,则推荐Place Holder方法2. Place Holder(占位) ...
- 在 Vim 中优雅地查找和替换 vi【转】
本文转载自:http://harttle.land/2016/08/08/vim-search-in-file.html 总有人问我 Vim 中能不能查找,当然能!而且是超级强的查找! 这篇文章来详细 ...