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. 编译错误 ----- /usr/bin/ld: cannot find -lc

    yum install glibc-static glib-static是Gcc链接时使用到的库.

  2. python排序函数sort()与sorted()区别

    sort是容器的函数:sort(cmp=None, key=None, reverse=False) sorted是python的内建函数:sorted(iterable, cmp=None, key ...

  3. hduPiggy-Bank(完全背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=1114 此题就是最简单的完全背包,顺序!!! for i=1..N for v=0..V f[v]=max{f[v ...

  4. windows7触屏编程

    每当用户触摸触敏式 Windows 7 设备时,Windows 7 多点触控平台都会向您的应用程序发送手势消息 WM_GESTURE.这是现成的免费行为,如果您希望停止接收此类消息,则需要选择退出. ...

  5. 支持向量机:Numerical Optimization,SMO算法

    http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html 另外一篇:http://www.cnblogs.com/vivouni ...

  6. [Leetcode] 49. Group Anagrams_Medium

    Given an array of strings, group anagrams together. Example: Input: ["eat", "tea" ...

  7. 深入浅出TCP之listen

    原文:http://blog.chinaunix.net/uid-29075379-id-3858844.html int listen(int fd, int backlog); 有几个概念需要在开 ...

  8. BinarySearch

    今天看代码,看到这么一段,开始没有看明白,记录下来备忘 foreach (FinancialReport r3 in addAorList)            {                i ...

  9. STA分析(一) setup and hold

    timing check可以分为Dynamic Timing Analysis(Post_sim)和Static Timing Analysis STA:可以分析的很全面:仿真速度也很快:可以分析控制 ...

  10. http-equiv制作跳转欢迎页面

    做网站嘛,没有个欢迎页面肿么能忍? 要忽悠下浏览者的嘛. 然后此处省略一万字... 目的:不需要其他的脚本,直接在meta中控制时间,跳转页面 原理很简单: < meta http-equiv= ...