题意:有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(状压 + 暴搜)题解相关推荐

  1. 紫书搜索 习题7-4 UVA - 818 Cutting Chains 暴力+dfs判环+位运算

    题目链接: https://vjudge.net/problem/UVA-818 题意: 选几个圆环去open.然后该圆环和其他就断开了.然后用这些open的圆环去连接剩下的圆环[最后打开的会合上], ...

  2. UVA 818 Cutting Chains 切断圆环链 (暴力dfs)

    题意就是给一张无向图,去掉某些结点,然后连成一条链,问最少去掉几个结点. n很小n<=15,所以直接枚举2^15个状态就行啦. 链的条件是1.无环,2.没有度大于2的点,3.把n个散链连起来需要 ...

  3. AcWing1064.骑士(状压DP)题解

    Acwing.骑士(状压DP) 题目传送门 题目描述 在 n×n 的棋盘上放 k 个国王,国王可攻击相邻的 8 个格子,求使它们无法互相攻击的方案总数. 输入格式 共一行,包含两个整数 n 和 k. ...

  4. UVA - 1252 Twenty Questions (状压dp+vis数组加速)

    有n个物品,每个物品有m个特征.随机选择一个物品让你去猜,你每次可以询问一个特征的答案,问在采取最优策略时,最坏情况下需要猜的次数是多少. 设siz[S]为满足特征性质集合S的特征的物品总数,dp[S ...

  5. UVA 1633 Dyslexic Gollum (状压dp)

    分析:dp[i][j]表示当前为i长度,长度为k的后缀状态,有多少个串.考虑一下k和k+1长度的串是否为回文串即可 代码: #include <iostream> #include < ...

  6. AcWing292.炮兵阵地(状压DP)题解

    Acwing.炮兵阵地 题目传送门 题目描述 司令部的将军们打算在N * M的网格地图上部署他们的炮兵部队.一个N * M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表 ...

  7. POJ 1185 炮兵阵地(状压DP)题解

    思路:和上一篇思路一样,但是这里要求最大能排几个,这里要开三维,记录上次和上上次的状态,再一一判定,状态转移方程为 dp[i][j][k] = max(dp[i][j][k],dp[i - 1][k] ...

  8. [ NOIP提高组 2016]愤怒的小鸟(暴搜 + 状压DP)// [SNOI2017]一个简单的询问(莫队)

    一次性写两道题 T1:一个简单的询问 题目 题解 代码实现 T2:愤怒的小鸟 题目 暴搜题解 暴搜代码实现 状压DP题解 状压DP代码实现 T1:一个简单的询问 题目 给你一个长度为 N 的序列 ai ...

  9. 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP

    [题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...

最新文章

  1. Sqlserver 错误日志太大导致硬盘空间不足
  2. 透明色代码是多少_北京宣传画册印刷多少钱
  3. iOS中js与objective-c的交互(转)
  4. 三剑客之 sed详解
  5. 关于Remoting(续)
  6. python day23
  7. QBC检索和本地SQL检索
  8. 63. windows php 加载不了 curl
  9. Google之海量数据的交互式分析工具Dremel
  10. 通过sql脚本可以从数据库中查到数据,但是通过jdbc却获取不到
  11. 课程管理系统(面向对象python)
  12. spring 的bean 作用域
  13. Eplan执行翻译操作详细教程
  14. 激光雷达系统原理及相关介绍
  15. 夜神模拟器怎么设置android版本号,adb连接夜神模拟器(包括安装adb,夜神模拟器)需要将夜神模拟器的版本号与adb版本一致...
  16. scrapy_redis实现分布式爬取京东图书数据
  17. 有意思的张飞日记-_-
  18. 蓝图(blueprint)的理解和用法
  19. 3650m5服务器内存选择 ibm_重返荣耀 联想System x3650 M5服务器评测
  20. 备战蓝桥杯-双指针、BFS

热门文章

  1. 设计模式之监听器模式
  2. JavaScript 方法传参
  3. Quartz.Net 1.30的一些设置说明
  4. jquery获取元素在文档中的位置信息以及滚动条位置(转)
  5. android自己定义刷新类控件
  6. 在ActionBar显示ShareActionProvider分享文本,点击可以打开进行分享(19)
  7. homework-04
  8. OpenCV学习(4) Mat的基本操作(1)
  9. ASP.NET-Cookies的用法
  10. Linux下date命令的修改时间问题