UVA-818 Cutting Chains (位压缩+暴力搜索)
题目大意:一种环能打开和闭合。现在有n(1<=n<=15)个编号为1~n的环错综复杂的连接着,要打开一些环重新连接使这n个环能构成一条链,问最少需要打开几次环可达到目的?
题目分析:用二进制数表示要打开的环的集合,总共2^n种情形,枚举每一种情况。当把将要打开的环打开后,此环是孤立的,接下来就要判断剩下的环还与几个环连着,如果有的环仍然与两个以上的环连着则该方案不可行,不可能构成链;然后判断剩下的环有没有连成一个圈,如果有,则该方案不可行;最后,判断完前两个条件之后,所有的环都一定处于某条短链(长度小于等于n)中,只需判断一下短链的条数是否小于等于打开的环数加1,若不成立,则一定连不成一条链,若成立,则该方案可行。
代码如下:
# include<iostream>
# include<cstdio>
# include<set>
# include<cstring>
# include<algorithm>
using namespace std; int n,ans,st[15],s[15],vis[15]; int bitCount(int sta)
{
return sta==0?0:bitCount(sta>>1)+(sta&1);
} void dfs(int u,int pre)
{
for(int i=0;i<n;++i){
if(i!=pre&&s[u]&(1<<i)){
++vis[i];
if(vis[i]<2)
dfs(i,u);
}
}
} bool ok(int sta)
{
for(int i=0;i<n;++i)
s[i]=st[i]; ///打开环
for(int i=0;i<n;++i){
if(sta&(1<<i)){
s[i]=0;
for(int j=0;j<n;++j){
if(j!=i&&s[j]&(1<<i))
s[j]^=(1<<i);
}
}
} ///判度
for(int i=0;i<n;++i)
if(!(sta&(1<<i))&&bitCount(s[i])>2)
return false; ///判圈
int link=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;++i){
if(!vis[i]&&!(sta&(1<<i))){
++link;
++vis[i];
dfs(i,-1);
}
}
for(int i=0;i<n;++i)
if(vis[i]>=2)
return false; ///判链
if(link-1>bitCount(sta))
return false; return true;
} int main()
{
int a,b,cas=0;
while(scanf("%d",&n)&&n)
{
memset(st,0,sizeof(st));
while(scanf("%d%d",&a,&b))
{
if(a==-1&&b==-1)
break;
st[a-1]|=(1<<(b-1));
st[b-1]|=(1<<(a-1));
} ans=n;
int tot=1<<n;
for(int i=0;i<tot;++i)
if(ok(i))
ans=min(ans,bitCount(i)); printf("Set %d: Minimum links to open is %d\n",++cas,ans);
}
return 0;
}
UVA-818 Cutting Chains (位压缩+暴力搜索)的更多相关文章
- UVA 818 Cutting Chains 切断圆环链 (暴力dfs)
题意就是给一张无向图,去掉某些结点,然后连成一条链,问最少去掉几个结点. n很小n<=15,所以直接枚举2^15个状态就行啦. 链的条件是1.无环,2.没有度大于2的点,3.把n个散链连起来需要 ...
- UVA 818 Cutting Chains(状压 + 暴搜)题解
题意:有1~n个小环,他们中的有些互相扣在一起,问你至少切开几个能把这写小环串成一条链 思路:还是太菜了,题目给的n<=15,显然可以暴力解决. 用二进制表示每个环切还是不切,然后搜索所有情况. ...
- UVA 818 Cutting Chains
https://vjudge.net/problem/UVA-818 题意: 有n个圆环,其中有一些已经扣在了一起.现在需要打开尽量少的圆环,使得所有圆环可以组成一条链 n<=15 因为n< ...
- UVA - 818 Cutting Chains(切断圆环链)(dfs + 二进制法枚举子集)
题意:有n个圆环(n<=15),已知已经扣在一起的圆环,现在需要打开尽量少的圆环,使所有圆环可以组成一条链. 分析:因为不知道要打开哪个环,如果列举所有的可能性,即枚举打开环的所有子集,最多才2 ...
- UVA 529 - Addition Chains,迭代加深搜索+剪枝
Description An addition chain for n is an integer sequence with the following four properties: a0 = ...
- UVA 10003 Cutting Sticks 区间DP+记忆化搜索
UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...
- uva 818 (位运算 + 判环)
Cutting Chains What a find! Anna Locke has just bought several links of chain some of which may be ...
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- ACM 暴力搜索题 题目整理
UVa 129 Krypton Factor 注意输出格式,比较坑爹. 每次要进行处理去掉容易的串,统计困难串的个数. #include<iostream> #include<vec ...
随机推荐
- 远程获得的有趣的linux命令
使用这些工具从远程了解天气.阅读资料等. 我们即将结束为期 24 天的 Linux 命令行玩具日历.希望你有一直在看,如果没有,请回到开始,从头看过来.你会发现 Linux 终端有很多游戏.消遣和奇怪 ...
- web前端----Bootstrap框架
Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支持响应式布局,并且 ...
- 探索Java8:Stream的使用
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达 ...
- mac下的一些操作
mac 下修改Hosts文件 : http://www.cnblogs.com/zhangqs008/p/3773623.html mac下装Tomcat服务器: 在苹果系统安装Tomcat:首先下载 ...
- SQLSERVER 数据从一张那个表复制到另一张表
insert into 表名1 ( 字段A ,字段B ,字段C) SELECT 字段A ,字段B ,字段C FROM 表名2 (where条件看情况而定)
- HDU 1811(并查集+拓扑排序)题解
Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球.为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他 ...
- 第八章 对称加密算法--AES
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第7章“初等加密算法--对称加密算法” 8.1.AES 特点: 密钥建立时间短.灵敏性好.内存需求低(不管怎样,反正就是好) ...
- Hive创建内部表、外部表
使用hive需要hive环境 启动Hive 进入HIVE_HOME/bin,启动hive ./hive 内部表 建表 hive> create table fz > (id int,nam ...
- 【TCP/IP详解 卷一:协议】第一章概论 学习笔记
第一章 概述 游览了一下,本章主要是简介OSI模型的低层(1-4层).介绍了TCP/IP协议族的相关知识. TCP/IP的分层 Application <--> TCP / UDP < ...
- NS3 使用NS3工具PyViz
官方文档 跑了一个样例(first.py): 由于 NetAnim 对我实在是有点不友好,在 PyViz 和 NetAnim 之间,我倾向前者.后者需要生成.xml文件,相比前者较为麻烦. 安装过程: ...