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的更多相关文章

  1. HDU 4687 Boke and Tsukkomi (一般图匹配带花树)

    Boke and Tsukkomi Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Othe ...

  2. HDU 4687 Boke and Tsukkomi 一般图匹配,带花树,思路,输出注意空行 难度:4

    http://acm.hdu.edu.cn/showproblem.php?pid=4687 此题求哪些边在任何一般图极大匹配中都无用,对于任意一条边i,设i的两个端点分别为si,ti, 则任意一个极 ...

  3. HDU 4687 Boke and Tsukkomi (一般图最大匹配)【带花树】

    <题目链接> 题目大意: 给你n个点和m条边,每条边代表两点具有匹配关系,问你有多少对匹配是冗余的. 解题分析: 所谓不冗余,自然就是这对匹配关系处于最大匹配中,即该匹配关系有意义.那怎样 ...

  4. HDOJ 4687 Boke and Tsukkomi 一般图最大匹配带花树+暴力

    一般图最大匹配带花树+暴力: 先算最大匹配 C1 在枚举每一条边,去掉和这条边两个端点有关的边.....再跑Edmonds得到匹配C2 假设C2+2==C1则这条边再某个最大匹配中 Boke and ...

  5. Hdu4687 Boke and Tsukkomi

    Boke and Tsukkomi                                                                               Time ...

  6. HDU-4687 Boke and Tsukkomi 带花树,枚举

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4687 题意:给一个无向图,求所有的最大匹配的情况所不包含的边.. 数据比较小,直接枚举边.先求一次最大 ...

  7. hdu 4687 带花树匹配

    其实吧,思路挺简单的,只不过昨天刚学,还有一些东西不太了解,然后就23333333... 吃晚饭回来就A了,我是有多傻啊,这么题都A不掉,不能忍啊... 我们可以先求出哪些边是可能存在于最大匹配中的, ...

  8. 二分图水一波~~~~d带你飞

    Current Time: 2016-03-11 17:45:36 Contest Type: Public Start Time: 2016-03-04 13:00:00 Contest Statu ...

  9. [kuangbin带你飞]专题十 匹配问题

        A-L 二分匹配 M-O 二分图多重匹配 P-Q 二分图最大权匹配 R-S 一般图匹配带花树 模板请自己找     ID Origin Title   61 / 72 Problem A HD ...

随机推荐

  1. 2014 HDU多校弟五场J题 【矩阵乘积】

    题意很简单,就是两个大矩阵相乘,然后求乘积. 用 Strassen算法 的话,当N的规模达到100左右就会StackOverFlow了 况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存 ...

  2. 基于visual Studio2013解决算法导论之029二叉搜索树

     题目 二叉搜索树 解决代码及点评 #include <stdio.h> #include <malloc.h> #include <stdlib.h> ty ...

  3. 达内TTS6.0课件basic_day04

  4. 编程算法 - 扑克牌的顺子 代码(C)

    扑克牌的顺子 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 从扑克牌中随机抽取5张牌, 推断是不是一个顺子, 即这5张牌是不是连续的. 2~1 ...

  5. 插件化-开启另外应用的activity

    1.清单文件 android:sharedUserId="com.zyh.tplugin" 2.视图 <LinearLayout xmlns:android="ht ...

  6. 在Vista以上版本运行WTL程序,有时候会提示“这个程序可能安装补正确...”的错误

    在Win7/Vista下,如何以兼容模式运行exe?     https://msdn.microsoft.com/en-us/library/dd371711(VS.85).aspx     问题描 ...

  7. 在MAC系统里添加开机启动任务(但是怎么才能知道自己程序的固定位置呢?)

    公司最近购进了几台MAC台式电脑,要在上面为一个项目做测试. MAC这么高大上的东西,还是第一次接触,折腾了半天好不容易安装了一些需要的应用服务上去,跑了一下还不错. 公司提倡节约用电,下班之后要把所 ...

  8. C#调用存储过程实现分页(个人代码笔记)

    分页的存储过程: drop proc LoadPageMain create Proc LoadPageMain @pageIndex )) Fid     ) ].Rows )            ...

  9. Xtrabackup全量备份与恢复mysql数据库

    一.Xtrabackup简单概述: Percona  Xtrabackup是开源免费的MySQL数据库热备份软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同 ...

  10. HTML5的优缺点是什么?

    HTML5的优缺点是什么?作为HTML的第五次重大修改,HTML5有哪些改进?HTML5又有哪些缺点? 网络标准 HTML5本身是由W3C推荐出来的,它的开发是通过谷歌.苹果,诺基亚.中国移动等几百家 ...