CodeForces 1155F Delivery Oligopoly

题目大意

给定一个已经是边双联通分量的图,要求删掉最多的边,使得最终得到的图是也是一个边双联通分量。输出保留的边。

分析

考虑我们如何构造出一个边双联通分量。

我们发现最终的答案一定是一个环带上一个环的样子(有点像糖葫芦)。

于是考虑强制以111为起点,每次向上面加上一条链。

考虑如何按照这样的方式来计算答案。

首先预处理一个状态g(i,j,S)g(i,j,S)g(i,j,S),表示从iii到jjj能否经过集合SSS中的点互相到达。

那么我们就可以定义状态f(S)f(S)f(S)为在SSS集合中的点形成一个边双联通分量。

转移显然,注意记录下转移路径,方便输出。 细节巨多。。。

参考代码

#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;const int Maxn = 14;
const int INF = 0x3f3f3f3f;int N, M;
vector<int> G[Maxn + 5];
void addedge(int u, int v) {G[u].push_back(v), G[v].push_back(u);
}int f[(1 << Maxn) + 5];
pair<int, int> last[(1 << Maxn) + 5];
int lasts[(1 << Maxn) + 5];bool go[Maxn + 3][Maxn + 3][(1 << Maxn) + 3];
int lastnode[Maxn + 3][Maxn + 3][(1 << Maxn) + 3];inline int lowbit(int x) {return x & (-x);}
inline int bitcount(int x) {int ret = 0;while(x) ret++, x -= lowbit(x);return ret;
}int main() {#ifdef LOACLfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifscanf("%d %d", &N, &M);for(int i = 1; i <= M; i++) {int u, v;scanf("%d %d", &u, &v);addedge(u, v);}memset(f, 0x3f, sizeof f);for(int u = 1; u <= N; u++)for(auto v : G[u])go[u][v][0] = true, lastnode[u][v][0] = u;for(int s = 0; s < (1 << N); s++)for(int i = 1; i <= N; i++)for(int j = 1; j <= N; j++) {if((s & (1 << (i - 1))) || (s & (1 << (j - 1))) || i == j || !go[i][j][s])continue;for(auto k : G[j]) {if(s & (1 << (k - 1))) continue;if(k == lastnode[i][j][s]) continue;int t = s ^ (1 << (j - 1));if(!go[i][k][t])go[i][k][t] = true, lastnode[i][k][t] = j;}}f[1] = 0;for(int s = 0; s < (1 << N); s++)for(int t = s; t; t = (t - 1) & s) {int lst = s ^ t;int cnt = bitcount(t) + 1;if(f[lst] + cnt >= f[s]) continue;for(int u = 1; u <= N; u++) {if(!(lst & (1 << (u - 1)))) continue;for(int v = 1; v <= N; v++) {if(!(lst & (1 << (v - 1)))) continue;if(go[u][v][t]) {f[s] = f[lst] + cnt;last[s] = make_pair(u, v);lasts[s] = t;}}}}if(f[(1 << N) - 1] == INF) {puts("-1");return 0;}printf("%d\n", f[(1 << N) - 1]);int t = (1 << N) - 1;while(t != 1) {int lst = lasts[t];int x = last[t].first, y = last[t].second;t ^= lst;while(lst) {int z = lastnode[x][y][lst];printf("%d %d\n", y, z);lst ^= (1 << (z - 1));y = z;}printf("%d %d\n", x, y);}return 0;
}

【CodeForces】【状压DP】1155F-Delivery Oligopoly相关推荐

  1. Codeforces Gym 100676G Training Camp 状压dp

    http://codeforces.com/gym/100676 题目大意是告诉你要修n门课,每门课有一个权值w[i], 在第k天修该课程讲获得k*w[i]的学习点数,给出了课程与先修课程的关系,要修 ...

  2. Educational Codeforces Round 13 E. Another Sith Tournament 状压dp

    E. Another Sith Tournament 题目连接: http://www.codeforces.com/contest/678/problem/E Description The rul ...

  3. CodeForces - 1550E Stringforces(二分+状压dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,只包含前 kkk 个小写字母以及通配符 ???,现在可以将通配符替换成任意的前 kkk 个字母中的一个.设 f[i]f[i]f[i] 为 ...

  4. Codeforces Beta Round #8 C. Looking for Order 状压dp

    题目链接: http://codeforces.com/problemset/problem/8/C C. Looking for Order time limit per test:4 second ...

  5. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  6. Codeforces ----- Kefa and Dishes [状压dp]

    题目传送门:580D 题目大意:给你n道菜以及每道菜一个权值,k个条件,即第y道菜在第x道后马上吃有z的附加值,求从中取m道菜的最大权值 看到这道题,我们会想到去枚举,但是很显然这是会超时的,再一看数 ...

  7. Gym - 101853E E. Maximum Sum (状压DP)

    原题地址:https://codeforces.com/gym/101853/problem/E 题意:给出一个n*n的矩阵,矩阵中每一个格子都有一个权值,选择一个格子就能拿到当前的权值,但是同时就不 ...

  8. 【状压DP】哈密顿回路问题

    [状压DP]哈密顿回路问题 lzq同学在我准备午睡的时候发了一道蓝桥杯的题目给我,是哈密顿回路的.第一次看的时候是想DFS+双向搜索优化减小搜索树规模,然后写烂了(如果有大佬用搜索优化写出来了麻烦教教 ...

  9. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

最新文章

  1. d-s 多传感器信息融合 matlab实现_自动驾驶中的多传感器融合
  2. jq修改导航栏样式(选中、使用两张图片替代的是否选中效果)
  3. P1742 最小圆覆盖
  4. react antd confirm content list_react简单的项目架构搭建过程
  5. gallery3d 代码分析之 glsurfaceview
  6. JAVA项目开发团队分配
  7. 大数据的大价值:大数据五大成功案例深度解析
  8. C/C++大数运算库介绍及安装
  9. assimp android build,Android assimp编译及引用
  10. 计算机主板用料,【技嘉H55评测】主板供电篇——CPU辅助电源-中关村在线
  11. 莫比乌斯反演 平衡规划 双端栈 双端队列 等价类等
  12. CentOS8配置yum/dnf镜像源
  13. 如何将PC上的Word文档分享到朋友圈
  14. 微信小程序:好玩的表情包机器人
  15. 用夜神模拟器+GPA分析Android游戏
  16. USB_HID协议基础
  17. 轻音乐背后的故事_研究背后的故事
  18. 我不问+你不说=误解
  19. ER Win 的官方下载地址
  20. 鸿蒙系统依靠高通芯片,鸿蒙系统+高通芯片合体!iPhone再见了

热门文章

  1. Mac OS 安装IE
  2. python模拟上传图片_用python创建自己的等离子图片模拟
  3. java学习总结(16.06.03)java中数组的定义和初始化
  4. 爱快固件是Linux系统吗,爱快硬路由和软路由系统有什么区别
  5. 知能行vs传统备考,考研数学可以很轻松!
  6. layui快速上手教程
  7. mysql 按比例计算排名_计算MS SQL中的百分比排名
  8. MBA联考内容及用书推荐
  9. 【信息汇总】浙江大学计算机考研
  10. 电子与计算机工程导论,BGPLUS科研荟萃 | 杜克大学 | 电子工程、计算机工程:电子与计算机工程导论...