【习题 7-4 UVA-818】Cutting Chains
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
二进制枚举要解开哪些环。
把所有和它相关的边都删掉。
对于剩下的联通分量。
看看是不是每一个联通分量都是一条链
->每个点的度数都不大于2
->不是环。
同时剩余的联通分量的个数x
解开的环的个数y
y>=x-1才行
满足以上条件即可
【代码】
#include <bits/stdc++.h>
using namespace std;
const int N = 20;
int n;
int g[N][N];
bool vis[N];
bool dfs(int x,int pre){
vis[x]=1;
int count = 0;
for (int i = 1;i <= n;i++)
if (g[x][i]>0 && i!=pre && !vis[i]){
count++;
if (count>2) return false;
if (!dfs(i,x)) return false;
}else {
if (i==pre) count++;
if (count>2) return false;
if (g[x][i]>0 && i!=pre && vis[i]) return false;
}
return true;
}
int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
int kase = 0;
while (cin >>n && n){
memset(g,255,sizeof g);
int x,y;
while (cin >> x >> y && !(x==-1 && y==-1)){
g[x][y] = 1;g[y][x] = 1;
}
int ma = 1<<n;
int ans = n;
for (int i = 0;i < ma;i++){
int out = 0;
memset(vis,0,sizeof vis);
for (int j = 0;j <n;j++){
if ((1<<j)&i){
out++;
vis[j+1] = 1;
for (int k = 1;k <= n;k++)
if (g[j+1][k]==1)
g[j+1][k] = g[k][j+1] = 0;
}
}
int lian = 0;
bool ok = true;
for (int i = 1;i <= n;i++)
if (!vis[i]){
ok = ok&dfs(i,-1);
if (!ok) break;
lian++;
}
if (ok && lian-1<=out){
ans = min(ans,out);
}
for (int j = 0;j <n;j++)
if ((1<<j)&i)
for (int k = 1;k <= n;k++)
if (g[j+1][k]==0)
g[j+1][k] = g[k][j+1] = 1;
}
cout << "Set "<<++kase<<": Minimum links to open is "<<ans << endl;
}
return 0;
}
【习题 7-4 UVA-818】Cutting Chains的更多相关文章
- 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^15个状态就行啦. 链的条件是1.无环,2.没有度大于2的点,3.把n个散链连起来需要 ...
- UVA - 818 Cutting Chains(切断圆环链)(dfs + 二进制法枚举子集)
题意:有n个圆环(n<=15),已知已经扣在一起的圆环,现在需要打开尽量少的圆环,使所有圆环可以组成一条链. 分析:因为不知道要打开哪个环,如果列举所有的可能性,即枚举打开环的所有子集,最多才2 ...
- uva 818 (位运算 + 判环)
Cutting Chains What a find! Anna Locke has just bought several links of chain some of which may be ...
- uva 10003 Cutting Sticks 【区间dp】
题目:uva 10003 Cutting Sticks 题意:给出一根长度 l 的木棍,要截断从某些点,然后截断的花费是当前木棍的长度,求总的最小花费? 分析:典型的区间dp,事实上和石子归并是一样的 ...
- UVA 10003 Cutting Sticks 区间DP+记忆化搜索
UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...
- UVa 10003 - Cutting Sticks(区间DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 10003 Cutting Sticks 切木棍 dp
题意:把一根木棍按给定的n个点切下去,每次切的花费为切的那段木棍的长度,求最小花费. 这题出在dp入门这边,但是我看完题后有强烈的既是感,这不是以前做过的石子合并的题目变形吗? 题目其实就是把n+1根 ...
随机推荐
- hdoj2066一个人的旅行
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- 流水线技术原理和Verilog HDL实现
所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时 ...
- 浅谈 C 语言中模块化设计的范式
今天继续谈模块化的问题.这个想慢慢写成个系列,但是不一定连续写.基本是想起来了,就整理点思路出来.主要还是为以后集中整理做点铺垫. 我们都知道,层次分明的代码最容易维护.你可以轻易的换掉某个层次上的某 ...
- 第四次python作业——叶耀宗
设计题2: 1.参考“三国演义”词频统计程序,实现对红楼梦出场人物的频次统计.2.(可选)将红楼梦出场人物的频次统计结果用词云显示. import jieba excludes = {"什么 ...
- PHP和js判断访问终端是否是微信浏览器
http://www.sucaihuo.com/php/813.html http://www.thinkphp.cn/extend/767.html http://blog.csdn.net/gf7 ...
- Qt Quick 之 PathView 具体解释
PathView ,顾名思义,沿着特定的路径显示 Model 内的数据. Model 能够是 QML 内建的 ListModel . XmlListModel ,也能够是在 C++ 中实现的 QAbs ...
- 压缩感知——SP(subspace pursuit)重构算法前言翻译
压缩感知是一种採样方法,它和变换编码类似,后者被广泛用于涉及到大规模数据採样的现代通信系统中.变换编码将高维空间中的输入信号.转换成很低的低维空间中的信号.变换编码器的样例有著名的小波变换和普遍存在的 ...
- 关于bootstrap IE8的兼容性问题
非常久没有写技术类的文章了.这几天在用bootstrap来做我们站点的UI框架,感觉还是不错的.只是遇到一点不大不小的问题,那就是有朋友在IE8下訪问我们的站点.界面变成了跟手机浏览一样的界面. 后来 ...
- LightOJ 1070 Algebraic Problem (推导+矩阵高速幂)
题目链接:problem=1070">LightOJ 1070 Algebraic Problem 题意:已知a+b和ab的值求a^n+b^n.结果模2^64. 思路: 1.找递推式 ...
- Objective-C 布尔类型 和 class、SEL类型
发现非常多刚開始学习的人无法区分bool和BOOL及class类型,今天闲来无事.写个博文做个区分 1. bool是C语言的布尔类型.有true和false,BOOL是Objective C 语言的布 ...