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+二进制枚举)的更多相关文章

  1. UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举)

    UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举) 题意分析 给出n*m的矩形格子,给出k个点,每个格子里面可以放一个点.现在要求格子的最外围一圈的每行每列,至少要放一个 ...

  2. poj3279(dfs+二进制枚举思路)

    题意转载自https://www.cnblogs.com/blumia/p/poj3279.html 题目属性:DFS 相关题目:poj3276 题目原文:[desc]Farmer John know ...

  3. UVA 1151二进制枚举子集 + 最小生成树

    题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此, 你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐(数 ...

  4. 紫书 例题 11-3 UVa 1151 (有边集的最小生成树+二进制枚举子集)

    标题指的边集是说这道题的套餐, 是由几条边构成的. 思路是先做一遍最小生成树排除边, 因为如果第一次做没有加入的边, 到后来新加入了很多权值为0的边,这些边肯定排在最前面,然后这条边的前面的那些边肯定 ...

  5. UVA - 1151 Buy or Build (买还是建)(并查集+二进制枚举子集)

    题意:平面上有n个点(1<=n<=1000),你的任务是让所有n个点连通.可以新建边,费用等于两端点欧几里德距离的平方.也可以购买套餐(套餐中的点全部连通).问最小费用. 分析: 1.先将 ...

  6. 【uva 1151】Buy or Build(图论--最小生成树+二进制枚举状态)

    题意:平面上有N个点(1≤N≤1000),若要新建边,费用是2点的欧几里德距离的平方.另外还有Q个套餐,每个套餐里的点互相联通,总费用为Ci.问让所有N个点连通的最小费用.(2组数据的输出之间要求有换 ...

  7. Good Bye 2015B(模拟或者二进制枚举)

    B. New Year and Old Property time limit per test 2 seconds memory limit per test 256 megabytes input ...

  8. HDU 5025Saving Tang Monk BFS + 二进制枚举状态

    3A的题目,第一次TLE,是因为一次BFS起点到终点状态太多爆掉了时间. 第二次WA,是因为没有枚举蛇的状态. 解体思路: 因为蛇的数目是小于5只的,那就首先枚举是否杀死每只蛇即可. 然后多次BFS, ...

  9. UVA1354-Mobile Computing(二进制枚举子集)

    Problem UVA1354-Mobile Computing Accept:267  Submit:2232 Time Limit: 3000 mSec  Problem Description ...

随机推荐

  1. [MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程

    [MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程 http://mysqllover.com/?p=581 尽管Mariadb以及Facebook在long ...

  2. Dokcerfile部署webpy,安装imagehash库并运行py脚本获取图片dhash值

    Dockerfile FROM lmurawsk/python2.7 RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple image ...

  3. [LeetCode] 415. Add Strings_Easy tag: String

    Given two non-negative integers num1 and num2 represented as string, return the sum of num1 and num2 ...

  4. cocos代码研究(1)Node学习笔记

    理论部分 Node类继承自Ref类,是cocos框架中基础底层的一个封装类,与画面渲染相关的类一般都是继承自该类,例如Scene,Layer,Sprite,Sprite3D,Label,SpriteB ...

  5. 企业中如何批量更改mysql中表的存储引擎?

    一.首先必须熟悉Mysql中有哪些基本的数据库,在mysql中database等价于schema,默认的基本库有四个:mysql,information_schema,performance_sche ...

  6. python 读写压缩文件

    gzip 和bz2 模块可以很容易的处理这些文件.两个模块都为open() 函数提供了另外的实现来解决这个问题.比如,为了以文本形式读取压缩文件,可以这样做: # gzip compression i ...

  7. OVS

    基于 OpenvSwitch的OpenFlow实践 Open vSwitch 概述 OpenvSwitch(简称OVS)是由NiciraNetworks主导的,运行在虚拟化平台(例如 KVM,Xen) ...

  8. 【R】书籍推荐

    From: http://xccds1977.blogspot.com/2013/02/r.html http://www.1point3acres.com/bbs/thread-51301-1-1. ...

  9. MySQL数据库读写分离、读负载均衡方案选择

    MySQL数据库读写分离.读负载均衡方案选择 一.MySQL Cluster外键所关联的记录在别的分片节点中性能很差对需要进行分片的表需要修改引擎Innodb为NDB因此MySQL Cluster不适 ...

  10. 2016NOI冬令营day1

    感冒了!!!: ( 上午听 picks 讲多项式导论(所有内容均不考)只听懂了那个O(n1.585)的多项式乘法算法 : ( 安装好了弹幕!太厉害了(有电脑的都在刷弹幕) :  ( 中午吃的不错 : ...