hdu 4687 Boke and Tsukkomi
Dancing link twice.
Find the maximum combination numbers in the first time.
Enumerate each node, dancing.
If the new result is not optimaze, then push it into ans.
#include <cstdio>
#include <vector>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
const int M = 200; // exact
struct dancing {
#define dfor(c, a, b) for (int c = a[b]; c != b; c = a[c])
static const int row_size = 220, column_size = 220,
total_size = row_size*column_size;
typedef int row[row_size],
column[column_size],
total[total_size];
total l, r, u, d, in_column, in_row;
bitset<50> use;
column s;
int index, current_row, row_head, limit, mx, rn;
void init(int n, int m) {
rn = m;
limit = 0;
index = ++n;
for (int i = 0; i < n; i++) {
l[i] = (i - 1 + n) % n;
r[i] = (i + 1) % n;
u[i] = d[i] = i;
}
current_row = 0;
memset(s, 0, sizeof(s));
use = ans = bitset<50>();
mx = -1;
}
void push(int i, int j) {
i++; j++;
if (current_row < i) {
row_head = l[index] = r[index] = index;
current_row = i;
}
l[index] = l[row_head]; r[index] = row_head;
r[l[row_head]] = index; l[row_head] = index;
u[index] = u[j]; d[index] = j;
d[u[j]] = index; u[j] = index;
s[j]++;
in_row[index] = i;
in_column[index++] = j;
}
void exactly_remove(int c) {
l[r[c]] = l[c];
r[l[c]] = r[c];
dfor(i, d, c) {
dfor (j, r, i) {
u[d[j]] = u[j];
d[u[j]] = d[j];
s[in_column[j]]--;
}
}
}
void exactly_resume(int c) {
dfor(i, u, c) {
dfor(j, l, i) {
s[in_column[j]]++;
d[u[j]] = u[d[j]] = j;
}
}
r[l[c]] = l[r[c]] = c;
}
bool exactly_dance(int step = 0) {
limit = max(limit, step);
if (limit == mx) return 1;
if (!r[0]) return 0;
int has = rn-use.count();
if (!has || step+has < limit || step+has < mx) return 0;
int x = r[0];
dfor(i, r, 0) {
if (s[i] && s[i] < s[x] || !s[x]) {
x = i;
}
}
exactly_remove(x);
dfor(i, d, x) {
use[in_column[i]] = 1;
dfor(j, r, i) {
exactly_remove(in_column[j]);
}
if (exactly_dance(step + 1)) {
return 1;
}
dfor(j, l, i) {
exactly_resume(in_column[j]);
}
use[in_column[i]] = 0;
}
exactly_resume(x);
return 0;
}
#undef dfor
};
dancing dlx; struct com {
int b, t;
void input() {
scanf("%d%d", &b, &t);
}
} c[M];
int n, m, g[M][50]; int main() {
for ( ; ~scanf("%d%d", &n, &m); ) {
memset(g, 0, sizeof(g));
dlx.init(n, m);
for (int i = 0; i < m; i++) {
c[i].input();
if (c[i].b > c[i].t) swap(c[i].b, c[i].t);
int b = c[i].b, t = c[i].t;
g[i][b] = g[i][t] = 1;
dlx.push(i, b-1);
dlx.push(i, t-1);
}
dlx.exactly_dance();
int limit = dlx.limit;
vector<int> ans;
int ban[M] = {0};
for (int i = 0; i < m; i++) {
int tm = m;
memset(ban, 0, sizeof(int)*m);
for (int j = 0; j < m; j++) if (i != j)
if (g[j][c[i].b] || g[j][c[i].t]) {
ban[j] = 1;
tm--;
}
dlx.init(n, tm);
for (int j = 0; j < m; j++) if (!ban[j]) {
dlx.push(j, c[j].b-1);
dlx.push(j, c[j].t-1);
}
dlx.mx = limit;
dlx.exactly_dance();
if (limit != dlx.limit) ans.push_back(i+1);
}
printf("%d\n", (int)ans.size());
if (!ans.size()) puts("");
else for (int i = 0; i < ans.size(); i++)
printf("%d%c", ans[i], i < ans.size()-1? ' ': '\n');
}
return 0;
}
hdu 4687 Boke and Tsukkomi的更多相关文章
- HDU 4687 Boke and Tsukkomi (一般图匹配带花树)
Boke and Tsukkomi Time Limit: 3000/3000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Othe ...
- HDU 4687 Boke and Tsukkomi 一般图匹配,带花树,思路,输出注意空行 难度:4
http://acm.hdu.edu.cn/showproblem.php?pid=4687 此题求哪些边在任何一般图极大匹配中都无用,对于任意一条边i,设i的两个端点分别为si,ti, 则任意一个极 ...
- HDU 4687 Boke and Tsukkomi (一般图最大匹配)【带花树】
<题目链接> 题目大意: 给你n个点和m条边,每条边代表两点具有匹配关系,问你有多少对匹配是冗余的. 解题分析: 所谓不冗余,自然就是这对匹配关系处于最大匹配中,即该匹配关系有意义.那怎样 ...
- HDOJ 4687 Boke and Tsukkomi 一般图最大匹配带花树+暴力
一般图最大匹配带花树+暴力: 先算最大匹配 C1 在枚举每一条边,去掉和这条边两个端点有关的边.....再跑Edmonds得到匹配C2 假设C2+2==C1则这条边再某个最大匹配中 Boke and ...
- Hdu4687 Boke and Tsukkomi
Boke and Tsukkomi Time ...
- HDU-4687 Boke and Tsukkomi 带花树,枚举
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4687 题意:给一个无向图,求所有的最大匹配的情况所不包含的边.. 数据比较小,直接枚举边.先求一次最大 ...
- hdu 4687 带花树匹配
其实吧,思路挺简单的,只不过昨天刚学,还有一些东西不太了解,然后就23333333... 吃晚饭回来就A了,我是有多傻啊,这么题都A不掉,不能忍啊... 我们可以先求出哪些边是可能存在于最大匹配中的, ...
- 二分图水一波~~~~d带你飞
Current Time: 2016-03-11 17:45:36 Contest Type: Public Start Time: 2016-03-04 13:00:00 Contest Statu ...
- [kuangbin带你飞]专题十 匹配问题
A-L 二分匹配 M-O 二分图多重匹配 P-Q 二分图最大权匹配 R-S 一般图匹配带花树 模板请自己找 ID Origin Title 61 / 72 Problem A HD ...
随机推荐
- 作为Qt 合作伙伴的V-Play,比大家都领先了一步 planet.qt.io
今天发布博客,将Flappy Bird和其它的小游戏移植到Respberry PI了 http://planet.qt.io/ planet.qt.io 的repo: https://coderevi ...
- setitimer()函数使用
setitimer()为Linux的API,并非C语言的Standard Library,setitimer()有两个功能,一是指定一段时间后,才执行某个function,二是每间格一段时间就执行某个 ...
- 建立Go工作环境
最近在折腾Go语言,找了个开源项目nsq研究源代码.不过前两天不小心把系统搞挂了,这次又要重做一遍,记录一下,备忘. 准备: 1. vim+golang插件+ctags(新版本支持Go) 2. Go1 ...
- hdu 4063 Aircraft(计算几何+最短路)
不说了...说多了都是泪...从昨天下午一直wa到现在,直到刚刚才让人帮我找到所谓的“bug”,其实也算不上bug... 这个题的思路就是:找出平面上的所有点:所有圆的交点以及所有圆的圆心.然后依次判 ...
- oracle dg坏境主库redolog改动大小
--备库standby 主库四个redolog 曾经都是50M大小 SQL> alter database recover managed standby database cancel; ...
- 一口一口吃掉Hibernate(八)——Hibernate中inverse的用法
一.Inverse是hibernate双向关系中的基本概念.inverse的真正作用就是指定由哪一方来维护之间的关联关系.当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之 ...
- [置顶] 编程模仿boost::function和boost::bind
boost::function和boost::bind结合使用是非常强大的,他可以将成员函数和非成员函数绑定对一个对象上,实现了类似C#的委托机制.委托在许多时候可以替代C++里面的继承,实现对象解耦 ...
- const对象默认是static的,而不是extern的
const 和 static 变量,可以放在头文件中 const对象默认是static的,而不是extern的,所以即使放在头文件中声明和定义.多个cpp引用同一个头文件,互相也没有感知,所以不会导致 ...
- Android 程式开发:(廿二)服务 —— 22.1 自定义服务
服务,就是跑在后台的“程序”,不需要和用户进行交互.举个例子,当使用一款应用的时候,可能同时想在后台播放一些音乐.在这种情况下,后来播放音乐的代码不需要和用户进行交互,所以,它就可能被当成一个服务.当 ...
- 九度OnlineJudge之1017:还是畅通工程
题目描述: 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可 ...