UVa 818 切断圆环链(dfs+二进制枚举)
https://vjudge.net/problem/UVA-818
题意:有n个圆环,其中有一些已经扣在了一起。现在需要打开尽量少的圆环,使得所有圆环可以组成一条链,例如,有5个圆环,1-2,2-3,4-5,则需要打开一个圆环,如圆环4,然 后用它穿过圆环3和圆环5后再次闭合4,就可以形成一条链:1-2-3-4-5。
思路:从n个圆环中任意选择圆环,这就是枚举子集。所以这道题目可以用二进制枚举来做。
那么如何判断当前打开圆环是可行的呢?在去除打开的圆环后需要判断:
①:每个圆环的分支数都必须小于等于2,大于2个肯定就不能成为单链了。
②:不能存在环。
③:连通分支数-1不能大于打开圆环数。
判断是否存在圆环和连通分支数都可以用dfs来实现。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std; int n,cnt,number;
int map[][];
int vis[];
int ans; bool two(int s) //判断是否有分支数大于2的圆环
{
for (int i = ; i < n; i++)
{
int cnt = ; //记录分支数
for (int j = ; j < n; j++)
{
//如果圆环i和j连通并且没有打开i或j时,i圆环的分支数+1
if (map[i][j] && !(s&( << i)) && !(s & << j))
{
cnt++;
if (cnt == ) return true;
}
}
}
return false;
} bool dfs(int x,int f,int s) //判断是否有回路存在
{
vis[x]=;
for (int i = ; i < n; i++)
{
if (map[x][i])
{
if (i == f || (s&( << i))) continue; //如果i是上一次访问的圆环或者i圆环被打开,进行下一次判定
if (vis[i]) return true; //存在回路
if (dfs(i, x, s)) return true;
}
}
return false;
} bool circle(int s)
{
memset(vis, , sizeof(vis));
for (int i = ; i < n; i++)
{
if (!vis[i] && !(s & ( << i)))
{
number++; //连通分量数+1
if (dfs(i , -, s)) return true;
}
}
return false;
} int calc(int s) //计算出打开圆环的个数
{
int cnt = ;
for (int j = ; j < n; j++)
{
if (s&( << j)) cnt++;
}
return cnt;
} void solve()
{
ans = ;
for (int i = ; i < ( << n); i++) //二进制枚举打开圆环的情况
{
number = ;
if (two(i) || circle(i)) continue; //如果不行,进行下一次判断,如果不存在两个分支或回路,则正好计算出了连通分支数
int count = calc(i);
if (number - <= count) ans = min(ans, count); //连通分支数-1不能多于打开的圆环数
}
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
int a, b, kase=;
while (cin >> n && n)
{
memset(map, , sizeof(map));
while (cin >> a >> b && a != - && b != -)
{
map[a-][b-] = ;
map[b-][a-] = ;
}
solve();
cout<<"Set "<<++kase<<": Minimum links to open is "<<ans<<endl;
}
return ;
}
UVa 818 切断圆环链(dfs+二进制枚举)的更多相关文章
- UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举)
UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举) 题意分析 给出n*m的矩形格子,给出k个点,每个格子里面可以放一个点.现在要求格子的最外围一圈的每行每列,至少要放一个 ...
- poj3279(dfs+二进制枚举思路)
题意转载自https://www.cnblogs.com/blumia/p/poj3279.html 题目属性:DFS 相关题目:poj3276 题目原文:[desc]Farmer John know ...
- UVA 1151二进制枚举子集 + 最小生成树
题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此, 你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐(数 ...
- 紫书 例题 11-3 UVa 1151 (有边集的最小生成树+二进制枚举子集)
标题指的边集是说这道题的套餐, 是由几条边构成的. 思路是先做一遍最小生成树排除边, 因为如果第一次做没有加入的边, 到后来新加入了很多权值为0的边,这些边肯定排在最前面,然后这条边的前面的那些边肯定 ...
- UVA - 1151 Buy or Build (买还是建)(并查集+二进制枚举子集)
题意:平面上有n个点(1<=n<=1000),你的任务是让所有n个点连通.可以新建边,费用等于两端点欧几里德距离的平方.也可以购买套餐(套餐中的点全部连通).问最小费用. 分析: 1.先将 ...
- 【uva 1151】Buy or Build(图论--最小生成树+二进制枚举状态)
题意:平面上有N个点(1≤N≤1000),若要新建边,费用是2点的欧几里德距离的平方.另外还有Q个套餐,每个套餐里的点互相联通,总费用为Ci.问让所有N个点连通的最小费用.(2组数据的输出之间要求有换 ...
- Good Bye 2015B(模拟或者二进制枚举)
B. New Year and Old Property time limit per test 2 seconds memory limit per test 256 megabytes input ...
- HDU 5025Saving Tang Monk BFS + 二进制枚举状态
3A的题目,第一次TLE,是因为一次BFS起点到终点状态太多爆掉了时间. 第二次WA,是因为没有枚举蛇的状态. 解体思路: 因为蛇的数目是小于5只的,那就首先枚举是否杀死每只蛇即可. 然后多次BFS, ...
- UVA1354-Mobile Computing(二进制枚举子集)
Problem UVA1354-Mobile Computing Accept:267 Submit:2232 Time Limit: 3000 mSec Problem Description ...
随机推荐
- vue中使用better-scroll实现滑动效果
1.安装:npm install better-scroll 2.引入:import BetterScrol from "better-scroll"; 1.滚动效果 better ...
- 十天精通CSS3(7)
:enabled选择器 在Web的表单中,有些表单元素有可用(“:enabled”)和不可用(“:disabled”)状态,比如输入框,密码框,复选框等.在默认情况之下,这些表单元素都处在可用状态.那 ...
- 手工利用Chrome浏览器“Javascript控制台”
1.打开Chrome浏览器,输入网址:http://forum.csdn.net/SList/HTMLCSS/ 2.按下“Ctrl+Shift+J”打开“Javascript控制台”工具 3.动态引用 ...
- 第七章之main函数和启动例程
main函数和启动例程 为什么汇编程序的入口是_start,而C程序的入口是main函数呢?本节就来解释这个问题.在讲例 18.1 “最简单的汇编程序”时,我们的汇编和链接步骤是: $ as hell ...
- Firefox及我使用的firefox扩展
什么数字安全浏览器,什么极速浏览器,现在都取代不了Firefox在我心中的位置.你想想,一款浏览器老是弹呀弹的,时不时问我换不换桌面,问我请不清理垃圾,真是的,这些关它浏览器鸟事. 喜欢Firefox ...
- 模仿WIN32程序处理消息
#include "stdafx.h" #include "MyMessage.h" #include <conio.h> using namesp ...
- lnmp之mysql5.5.17安装
先执行命令yum install cmake mysql5.5采用的是cmake安装(更先进的configure) wget下载目录(到清华大学的镜像站下载) [root@localhost loca ...
- Bootstrap3-文字样式
Bootstrap将全局font-size设置为14px,line-height为1.428.这些属性直接赋给<body>和所有段落元素.另外,<p>(段落)还被设置了等于1/ ...
- Atcoder Tenka1 Programmer Contest 2019 D Three Colors
题意: 有\(n\)个石头,每个石头有权值,可以给它们染'R', 'G', 'B'三种颜色,如下定义一种染色方案为合法方案: 所有石头都染上了一种颜色 令\(R, G, B\)为染了'R', 染了'G ...
- OpenStack trove原理及配置实践
DBaaS是什么? 字面上理解数据库即是服务,简单来说就是以服务的形式为用户提供数据库服务. 在云平台上使用trove有什么优势? 简化IT操作流程,降低使用数据库使用门槛举个例子,曾经我搭建一个LA ...