暴力枚举一些圆环,将这些圆环解开,看能否成为单链。判断单链的三个条件:

  1. 除了这些删除的圆环之外,其他圆环还连接着的圆环不能超过两个。
  2. 剩下的环没有连成圈。
  3. 剩下的圆环共分成m堆,每堆之间无连接,m必须小于等于解开的圆环数+1。

最多有15个环,可以用二进制保存。

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std; 

#define pos(x) (1 << ((x) - 1))
const int maxn = 20;
int g[maxn], vis[maxn], d[maxn];
int n;

int bit(int x) {
	int cnt = 0;
	while(x > 0) {
		if(x & 1) ++cnt;
		x >>= 1;
	}
	return cnt;
}

bool dfs(int u, int pre){
	vis[u] = -1;
	int m = g[u];
	for(int i = 1; i <= n; ++i){
		if(d[i] || i == pre || !(pos(i) & m)) continue;
		if(vis[i] == -1) return false;
		if(!vis[i] && !dfs(i, u)) return false;
	}
	vis[u] = 1;
	return true;
}

bool solve(int p){
	memset(vis, 0, sizeof(vis));
	memset(d, 0, sizeof(d));
	for(int i = 1; i <= n; ++i){
		if(pos(i) & p) d[i] = 1;
	}

	for(int i = 1; i <= n; ++i) {
		if(d[i]) continue;
		int x = 0;
		for(int j = 1; j <= n; ++j){
			if(!d[j] && pos(j) & g[i]) ++x;
		}
		if(x > 2) return false;
	}

	int cnt = 0; //联通块数量
	for(int i = 1; i <= n; ++i){
		if(vis[i] || d[i]) continue;
		if(!dfs(i, -1)) return false;  //有环
		++cnt;
	}
	if(cnt > bit(p) + 1) return false;  //大于独立的圆环数,无法连接
	return true;

}

int main() {
	int kase = 0;
	while(scanf("%d", &n) == 1 && n){
		int a, b;
		memset(g, 0, sizeof(g));
		while(1) {
			scanf("%d%d", &a, &b);
			if(a == -1 && b == -1) break;
			g[a] |= (1 << (b - 1)); //a can reach b
			g[b] |= (1 << (a - 1)); //b can reach a
		}
		int total = 1 << n;
		int ans = 1 << 30;
		for(int i = 0; i < total; ++i) {
			if(bit(i) >= ans) continue;
			if(solve(i)) {
				ans =min(ans, bit(i));
			}
		}
		printf("Set %d: Minimum links to open is %d\n", ++kase, ans);
	}
	return 0;
} 

如有不当之处欢迎指出!

UVA-818 dfs + 位运算的更多相关文章

  1. uva 818 (位运算 + 判环)

     Cutting Chains  What a find! Anna Locke has just bought several links of chain some of which may be ...

  2. UVa 818Cutting Chains (暴力dfs+位运算+二进制法)

    题意:有 n 个圆环,其中有一些已经扣在一起了,现在要打开尽量少的环,使所有的环可以组成一条链. 析:刚开始看的时候,确实是不会啊....现在有点思路,但是还是差一点,方法也不够好,最后还是参考了网上 ...

  3. 数独求解问题(DFS+位运算优化)

    In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgrids. For exa ...

  4. UVA 690 PipelineScheduling 位运算+dfs+剪枝

    一开始最容易想到间隔最多为n,但是结点还是太多了,需要优化. 预处理:预判一下并保存下一个可以放的位置距离之前的距离.这样可以减少很多判断. 最优化剪枝:如果当前长度+剩下没放的程序*最短间隔如果大于 ...

  5. POJ 1164 城堡问题【DFS/位运算/种子填充法/染色法】

    1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # | ...

  6. UVA 11464 暴力+位运算 ***

    题意:给你一个 n * n 的 01 矩阵,现在你的任务是将这个矩阵中尽量少的 0 转化为 1 ,使得每个数的上下左右四个相邻的数加起来是偶数.求最少的转化个数. 新风格代码 lrj书上说的很清楚了, ...

  7. uva 10718 Bit Mask (位运算)

    uva 10718  Bit Mask  (位运算) Problem A Bit Mask Time Limit 1 Second In bit-wise expression, mask is a ...

  8. 【位运算DFS/DLX】【HDU1426】【数独】

    题意:标准的一道数独题 DFS做法: 将横纵九宫格里的数字用位运算状态压缩,且可以通过逻辑或来确定总共有哪些数字被选择了,很方便也很快,代码如下 #include <cstdio> #in ...

  9. UVA 10718 Bit Mask 贪心+位运算

    题意:给出一个数N,下限L上限U,在[L,U]里面找一个整数,使得N|M最大,且让M最小. 很明显用贪心,用位运算搞了半天,样例过了后还是WA,没考虑清楚... 然后网上翻到了一个人家位运算一句话解决 ...

随机推荐

  1. 解决service层无法注入

    练手时发现个问题,路径404,各种检查发现,多加了一层<context:component-scan base-package="com.yanan.controller"/ ...

  2. 使用TransactionScope做分布式事务协调

    //场景是使用在多个数据库之间的协调,.NET 2.0使用一个新的类型 TransactionScope来进行协调,这与之前的COM+协调是相对来说更加方便的 //需要引用一个新的程序集:System ...

  3. OkHttp自定义重试次数

    本文主要应用了OkHttp的Interceptor来实现自定义重试次数 虽然OkHttp自带retryOnConnectionFailure(true)方法可以实现重试,但是不支持自定义重试次数,所以 ...

  4. nodejs爬虫笔记(四)---利用nightmare解决加载更多问题

    目标: 解决页面加载更多问题.笔记三中,我们只爬取到网页的部分信息,而点击加载更多后的页面内容是没有提取到的.开始我的想法是找到加载更多的数据接口(可参照:http://www.jianshu.com ...

  5. redis发布与订阅

    发布与订阅 除了实现任务队列外, Redis还提供了一组命令可以让开发者实现"发布/订阅"(publish/subscribe)模式. "发布/订阅"模式同样可 ...

  6. 关于Spring的注入方式

      spring的三种注入方式: 接口注入(不推荐) getter,setter方式注入(比较常用) 构造器注入(死的应用) 关于getter和setter方式的注入: autowire=" ...

  7. Spring Cache For Redis

    一.概述 缓存(Caching)可以存储经常会用到的信息,这样每次需要的时候,这些信息都是立即可用的. 常用的缓存数据库: Redis   使用内存存储(in-memory)的非关系数据库,字符串.列 ...

  8. 程序员之殇 —— (Are you afraid of me? Don't be.)灵感=神秘感

    Are you afraid of me? (你们怕我吗?) Don't be.(不用怕) I am a programmer who just won't die.(我是不会死的程序员) 自从跟踪到 ...

  9. Acrobat 转换pdf到png的另一种方法

    此方法效率较低,大概2秒转3页pdf成png图片,但是可以保证图片质量很高,分辨率很高.有优化的地方,但没时间研究.先放代码吧. 前提是安装 acrobat 11(即acrobat xi) CAcro ...

  10. 将Session放入Redis

    默认情况下,我们的PHP是以文件的形式保存Session数据,所以,每次读写会话信息,就需要去访问硬盘. 为了解决会话信息夸域名问题,即为了实现同一时刻只能一个地方登录,同时也解决读写会话信息必须访问 ...