2013 Multi-University Training Contest 9
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的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- JSU 2013 Summer Individual Ranking Contest - 5
JSU 2013 Summer Individual Ranking Contest - 5 密码:本套题选题权归JSU所有,需要密码请联系(http://blog.csdn.net/yew1eb). ...
- 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 ...
- 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 ...
- 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 ...
- 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) ...
- 2016 Multi-University Training Contest 2 D. Differencia
Differencia Time Limit: 10000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
随机推荐
- 手机抓包软件Charles安装使用实例 (流媒体播放测试可去下载的时刻检测)
手机抓包软件Charles安装使用实例 浏览:5258 发布日期:2015/07/17 分类:技术分享 关键字: 手机抓包软件 Charles 大胡子的博客Charles安装使用实例 Charle ...
- POJ 3349:Snowflake Snow Snowflakes(数的Hash)
http://poj.org/problem?id=3349 Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K T ...
- CentOS系统没有javac命令
自己捯饬的linux系统(CentOS)安装了jdk后,只能识别java命令而不识别javac.根据网上的教程设置环境变量后还是不行. 后来看了下/usr/java/jdk**目录下面根本没有java ...
- ACM题目————The partial sum problem
描述 One day,Tom’s girlfriend give him an array A which contains N integers and asked him:Can you choo ...
- SDUT 2413:n a^o7 !
n a^o7 ! Time Limit: 1000MS Memory limit: 65536K 题目描述 All brave and intelligent fighters, next you w ...
- hibernate关于一对一用法
首先来说一下数据库的表结构吧.主要涉及到两张表.一张是订单表sub_table 一张是商品表. 之后说entity public class SubTable { private Inte ...
- CI框架 QQ接口(第三方登录接口PHP版)
本帖内容较多,大部分都是源码,要修改的地方只有一个,其他只要复制过去,就可以完美运行.本帖主要针对CI框架,不用下载SDK,按我下面的步骤,建文件,复制代码就可以了.10分钟不要,接口就可完成.第一步 ...
- Pots 分类: 搜索 POJ 2015-08-09 18:38 3人阅读 评论(0) 收藏
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11885 Accepted: 5025 Special Judge D ...
- SHA1加密C#
//SHA1 static public string SHA1_Hash(string str_sha1_in) { SHA1 sha1 = new SHA1CryptoServiceProvide ...
- yum mysql on centos 7
参考:https://www.linode.com/docs/databases/mysql/how-to-install-mysql-on-centos-7 centos 7上没有办法使用yum i ...