HDU-4687 Boke and Tsukkomi

题意:给定一个简单图,询问哪些边如果选择的话会使得最大的连边数减少。

解法:套用一般图的最大匹配算法(带花树)先算出最大匹配数,然后枚举一条边被选择(注意:如果改变被选择,则两端点相邻的边都应删除),看是否只减少一条匹配边。

#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std; const int MAXN = ;
int n, m;
int u[], v[]; struct Graph { bool mat[MAXN + ][MAXN + ];
int n; bool inque[MAXN + ];
int que[MAXN], head, tail; int match[MAXN + ], father[MAXN + ], base[MAXN + ]; int inpath[MAXN + ];
static int pcnt; // count of paths have existed int inblossom[MAXN + ];
static int bcnt; // count of blossoms have existed void init(int _n) {
n = _n;
for (int i = ; i <= n; ++i) {
match[i] = ;
for (int j = ; j <= n; ++j)
mat[i][j] = false;
}
} int pop() { return que[head++]; } void push(int x) {
que[tail++] = x;
inque[x] = true;
} void add_edge(int a, int b) {
mat[a][b] = mat[b][a] = true;
} int find_ancestor(int u, int v) {
++pcnt;
while (u) {
u = base[u];
inpath[u] = pcnt;
u = father[match[u]];
// if match[u] == 0, meaning u is the root node, it also works, because father[0] == 0
}
while (true) {
v = base[v];
if (inpath[v] == pcnt) return v;
v = father[match[v]];
}
} void reset(int u, int anc) {
while (u != anc) {
int v = match[u];
inblossom[base[v]] = bcnt;
inblossom[base[u]] = bcnt;
v = father[v];
if (base[v] != anc) father[v] = match[u];
u = v;
}
} void contract(int u, int v) {
int anc = find_ancestor(u, v);
++bcnt;
reset(u, anc);
reset(v, anc);
if (base[u] != anc) father[u] = v;
if (base[v] != anc) father[v] = u;
for (int i = ; i <= n; ++i)
if (inblossom[base[i]] == bcnt) {
base[i] = anc;
if (!inque[i]) push(i);
}
} int find_augment(int start) {
for (int i = ; i <= n; ++i) {
father[i] = ;
inque[i] = false;
base[i] = i;
}
head = ; tail = ; push(start);
while (head < tail) {
int u = pop();
for (int v = ; v <= n; ++v)
if (mat[u][v] && base[v] != base[u] && match[v] != u) {
if (v == start || (match[v] && father[match[v]]))
// node v is out-point
contract(u, v); // make blossom
else {
if (father[v] == ) { // not in-point
if (match[v]) { // has matched
push(match[v]); // match[v] becomes out-point
father[v] = u; // v becomes in-point
} else {
father[v] = u; // node v is another end
return v;
}
}
}
}
}
return ;
} void augment(int finish) {
int u = finish, v, w;
while (u) {
v = father[u];
w = match[v];
match[u] = v;
match[v] = u;
u = w;
}
} int graph_max_match() {
int ans = ;
for (int i = ; i <= n; ++i)
if (match[i] == ) {
int finish = find_augment(i);
if (finish) {
augment(finish);
ans += ;
}
}
return ans;
} } g; int Graph::bcnt = , Graph::pcnt = ;
vector<int>vt; int main() {
while (scanf("%d %d", &n, &m) != EOF) {
g.init(n);
vt.clear();
bool first = true;
for (int i = ; i < m; ++i) {
scanf("%d %d", &u[i], &v[i]);
g.add_edge(u[i], v[i]);
}
int MaxPair = g.graph_max_match() / ; // 返回的是匹配的点数
for (int i = ; i < m; ++i) {
g.init(n);
int a = u[i], b = v[i];
for (int j = ; j < m; ++j) { // 如果匹配这条边那么两个端点其他连边都是不能匹配的
if (u[j] == a || u[j] == b || v[j] == a || v[j] == b) continue;
g.add_edge(u[j], v[j]);
}
int tmp = g.graph_max_match() / ;
if (tmp != MaxPair - ) vt.push_back(i+);
}
printf("%d\n", vt.size());
for (int i = ; i < (int)vt.size(); ++i) {
printf(i == ? "%d" : " %d", vt[i]);
}
puts("");
}
return ;
}

2013 Multi-University Training Contest 9的更多相关文章

  1. Integer Partition(hdu4658)2013 Multi-University Training Contest 6 整数拆分二

    Integer Partition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...

  2. Partition(hdu4651)2013 Multi-University Training Contest 5

    Partition Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków

    ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków Problem A: Rubik’s Rect ...

  4. Partition(hdu4651)2013 Multi-University Training Contest 5----(整数拆分一)

    Partition Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. JSU 2013 Summer Individual Ranking Contest - 5

    JSU 2013 Summer Individual Ranking Contest - 5 密码:本套题选题权归JSU所有,需要密码请联系(http://blog.csdn.net/yew1eb). ...

  6. HDU4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)

    Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. HDU 2018 Multi-University Training Contest 3 Problem A. Ascending Rating 【单调队列优化】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6319 Problem A. Ascending Rating Time Limit: 10000/500 ...

  8. 2015 Multi-University Training Contest 8 hdu 5390 tree

    tree Time Limit: 8000ms Memory Limit: 262144KB This problem will be judged on HDU. Original ID: 5390 ...

  9. hdu 4946 2014 Multi-University Training Contest 8

    Area of Mushroom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  10. 2016 Multi-University Training Contest 2 D. Differencia

    Differencia Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

随机推荐

  1. UIView完全置顶的方法

    一般来说,若需要独立添加一个UIView,使其覆盖于整个应用窗口之上,是这样实现的: AppDelegate *app = (AppDelegate *)[[UIApplication sharedA ...

  2. 【jqGrid for ASP.NET MVC Documentation】.学习笔记.4.性能

    1 HTML / ViewState 大小 1.1 HTML 大小 jqGrid for ASP.NET MVC 使用最佳的客户端渲染,意味着 HTML gird 的 尺寸是最小的.事实上,只有 gr ...

  3. VC中常用的宏

        我们在VS环境中开发的时候,会遇到很多宏定义,这些宏可以应用到代码中,或用于编译.工程选项等设置,总之是我们开发中必不可少的工具,有必要做一个总结.有些宏是C/C++定义的,有些宏是VC环境预 ...

  4. 28、Oracle(四)用户权限控制

    一)用户Oracle中的用户分为二大类1)Oracle数据库服务器创建时,由系统自动创建的用户,叫系统用户,如sys.2)利用系统用户创建的用户,叫普通用户,如scott,hr,c##tiger,zh ...

  5. 使用crontab不能正常执行的问题

    crontab -l:   列出当前用户的crontab列表crontab -e:   以vi打开crontab文件,可以进行编辑.如果需要加新的自启动项目,可以在此进行添加后再输入:wq 保存. & ...

  6. JavaScript脚本语言基础(一)

    导读: JavaScript代码嵌入HTML文档 JavaScript代码运行方式 第一个实例 JavaScript的三种对话框 定义JavaScript变量 JavaScript运算符和操作符 Ja ...

  7. HDU 4709:Herding

    Herding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  8. java对象equals方法的重写

    根类Object中的equals方法描述: public boolean equals(Object obj)The equals method for class Object implements ...

  9. poj1811 Prime Test

    http://poj.org/problem?id=1811 #include <cstdio> #include <cstring> #include <algorit ...

  10. javascript学习(二) DOM操作HTML

    一:DOM操作HTML JavaScript能够改变页面中所有的HTML元素 JavaScript能够改变页面中所有的HTML属性 JavaScript能够改变页面中所有的CSS样式 JavaScri ...