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. Dynamics AX 2012 R2 Service Middle Tier WCF WCF转发

    参考了蒋金楠老师08年的文章.好吧,那时候我才大二.大三,大神果然是大神. http://www.cnblogs.com/artech/archive/2008/09/01/1280939.html ...

  2. 图示-Centos7完整安装

    工作过程中,一些未接触过Centos,或未安装过Centos的同事经常会问,如何安装?这个事说简单真简单,只有操作过一次,第二次就能够熟练的自己动手安装:但说难也难,如果没人带,第一次安装的时候确实不 ...

  3. JavaEE基础(十五)/集合

    1.集合框架(对象数组的概述和使用) A:案例演示 需求:我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息. Student[] arr = new Student ...

  4. listview实现点击条目上的箭头展开隐藏菜单。

    效果如下图,当点击listview中的小三角时,显示出下面布局,再点隐藏, 点击其他条目的三角时,上一个展开的条目隐藏的同时展开当前条目. 思路是在item布局中放入展开菜单的布局,并设置状态为隐藏, ...

  5. [原创]南水之源A*(A-Star)算法

    开发导航之前我看了一些A*(A-Star)算法的例子和讲解.没有求得甚解!不过也从A*(A-Star)算法中得到启发,写了一套自己的A*(A-Star)算法.当然,这不是真正(我也不知道)的A*(A- ...

  6. weblogic远程调试

    修改 bin/startWebLogic.cmd 增加红字部分,其中9999是调试监听端口,然后可以连接这个端口进行远程调试 set JAVA_DEBUG=-Xdebug -Xnoagent -Xru ...

  7. ThinkPhp之分页

    function page($count,$pagesize=3){ $Page=new \Think\Page($count,$pagesize); //每页显示记录数 $Page->setC ...

  8. Behavior Designer中的内置消息机制

    最近在用Behavior Designer,其中需要用到消息机制,看了一下其中自带了这套东西 注册 Owner.RegisterEvent<string>("Message&qu ...

  9. SharePoint自动化系列——Add/Remove "Record" from items

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 目的:批量的将SharePoint items变成records或者将records变成普通的it ...

  10. Get与Post的一些总结

    1.GET请求的数据会附在URL之后,POST把提交的数据则放置在是HTTP包的包体中. 2."GET方式提交的数据最多只能是1024字节这句话是错误的 URL不存在参数上限的问题,HTTP ...