UVA 818 Cutting Chains(状压 + 暴搜)题解
题意:有1~n个小环,他们中的有些互相扣在一起,问你至少切开几个能把这写小环串成一条链
思路:还是太菜了,题目给的n<=15,显然可以暴力解决。
用二进制表示每个环切还是不切,然后搜索所有情况。当一种情况满足一下两点:1.切完之后每一串连在一起的环应该是一条链,没有分支没有环;2.当一个环被切开,那么他就可以当做任意串的连接点,那么显然切开的点+1>=串的数量。
代码:
#include<set> #include<map> #include<stack> #include<cmath> #include<queue> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> typedef long long ll; using namespace std; const int maxn = 15 + 10; const int seed = 131; const ll MOD = 100000007; const int INF = 0x3f3f3f3f; int vis[maxn], del[maxn], mp[maxn][maxn]; int n, ans, u, v, ca = 1, flag; bool branch(){int deg = 0;for(int i = 1; i <= n; i++){deg = 0;if(!del[i]){for(int j = 1; j <= n; j++){if(mp[i][j] && !del[j])deg++;}}if(deg > 2) return false;}return true; } bool dfs(int x, int pre){bool yes = true;vis[x] = 1;for(int i = 1; i <= n; i++){if(mp[x][i] && i != pre && !del[i]){if(vis[i]) return false;yes = dfs(i, x);if(!yes) return false;}}return true; } bool loop(int &rest){memset(vis, 0, sizeof(vis));flag = 0;for(int i = 1; i <= n; i++){if(!vis[i] && !del[i]){if(!dfs(i, -1)) return false;rest++;}}return true; } int main(){while(scanf("%d", &n) && n){memset(mp, 0, sizeof(mp));while(scanf("%d%d", &u, &v) && u != -1 && v != -1){mp[u][v] = mp[v][u] = 1;}int ans = INF, delet, rest;for(int i = 0; i < (1 << n); i++){memset(del, 0, sizeof(del));delet = rest = 0;for(int j = 0; j < n; j++){if(i & (1 << j)){del[j + 1] = 1;delet++;}}if(!branch() || !loop(rest)) continue;//printf("%d\n", delet);if(delet + 1 >= rest){ans = min(ans, delet);}}printf("Set %d: Minimum links to open is %d\n", ca++, ans);}return 0; }
转载于:https://www.cnblogs.com/KirinSB/p/10083643.html
UVA 818 Cutting Chains(状压 + 暴搜)题解相关推荐
- 紫书搜索 习题7-4 UVA - 818 Cutting Chains 暴力+dfs判环+位运算
题目链接: https://vjudge.net/problem/UVA-818 题意: 选几个圆环去open.然后该圆环和其他就断开了.然后用这些open的圆环去连接剩下的圆环[最后打开的会合上], ...
- UVA 818 Cutting Chains 切断圆环链 (暴力dfs)
题意就是给一张无向图,去掉某些结点,然后连成一条链,问最少去掉几个结点. n很小n<=15,所以直接枚举2^15个状态就行啦. 链的条件是1.无环,2.没有度大于2的点,3.把n个散链连起来需要 ...
- AcWing1064.骑士(状压DP)题解
Acwing.骑士(状压DP) 题目传送门 题目描述 在 n×n 的棋盘上放 k 个国王,国王可攻击相邻的 8 个格子,求使它们无法互相攻击的方案总数. 输入格式 共一行,包含两个整数 n 和 k. ...
- UVA - 1252 Twenty Questions (状压dp+vis数组加速)
有n个物品,每个物品有m个特征.随机选择一个物品让你去猜,你每次可以询问一个特征的答案,问在采取最优策略时,最坏情况下需要猜的次数是多少. 设siz[S]为满足特征性质集合S的特征的物品总数,dp[S ...
- UVA 1633 Dyslexic Gollum (状压dp)
分析:dp[i][j]表示当前为i长度,长度为k的后缀状态,有多少个串.考虑一下k和k+1长度的串是否为回文串即可 代码: #include <iostream> #include < ...
- AcWing292.炮兵阵地(状压DP)题解
Acwing.炮兵阵地 题目传送门 题目描述 司令部的将军们打算在N * M的网格地图上部署他们的炮兵部队.一个N * M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表 ...
- POJ 1185 炮兵阵地(状压DP)题解
思路:和上一篇思路一样,但是这里要求最大能排几个,这里要开三维,记录上次和上上次的状态,再一一判定,状态转移方程为 dp[i][j][k] = max(dp[i][j][k],dp[i - 1][k] ...
- [ NOIP提高组 2016]愤怒的小鸟(暴搜 + 状压DP)// [SNOI2017]一个简单的询问(莫队)
一次性写两道题 T1:一个简单的询问 题目 题解 代码实现 T2:愤怒的小鸟 题目 暴搜题解 暴搜代码实现 状压DP题解 状压DP代码实现 T1:一个简单的询问 题目 给你一个长度为 N 的序列 ai ...
- 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP
[题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...
最新文章
- Sqlserver 错误日志太大导致硬盘空间不足
- 透明色代码是多少_北京宣传画册印刷多少钱
- iOS中js与objective-c的交互(转)
- 三剑客之 sed详解
- 关于Remoting(续)
- python day23
- QBC检索和本地SQL检索
- 63. windows php 加载不了 curl
- Google之海量数据的交互式分析工具Dremel
- 通过sql脚本可以从数据库中查到数据,但是通过jdbc却获取不到
- 课程管理系统(面向对象python)
- spring 的bean 作用域
- Eplan执行翻译操作详细教程
- 激光雷达系统原理及相关介绍
- 夜神模拟器怎么设置android版本号,adb连接夜神模拟器(包括安装adb,夜神模拟器)需要将夜神模拟器的版本号与adb版本一致...
- scrapy_redis实现分布式爬取京东图书数据
- 有意思的张飞日记-_-
- 蓝图(blueprint)的理解和用法
- 3650m5服务器内存选择 ibm_重返荣耀 联想System x3650 M5服务器评测
- 备战蓝桥杯-双指针、BFS