[Ural1099]工作安排 带花树
题目大意
一般图最大匹配.
题解:
求解一般图最大匹配.
直接使用带花树即可.
(带花树也是刚学)...
马上写带花树的ppt,会很通俗易懂.
(充分证明了本苣智商不够,写不出高深的课件)
如果有想要的依然可以直接私信我 QAQ
带花树模板
#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
#define rg register int
#define rep(i,a,b) for(rg i=(a);i<=(b);++i)
#define per(i,a,b) for(rg i=(a);i>=(b);--i)
const int maxn = 256;
int n;
bool map[maxn][maxn],inq[maxn],inBlo[maxn],mark[maxn];
int link[maxn],fa[maxn],belong[maxn],q[maxn],l,r;
inline void bloom(int x,int y){
rep(i,0,n) mark[i] = inBlo[i] = false;
#define nx(x) fa[link[(x)]]
int lca;
for(rg i=x;i;i=nx(i)) mark[i = belong[i]] = true;
for(rg i=y;i;i=nx(i)){
i = belong[i];
if(mark[i]){lca = i;break;}
}
for(rg i=x;belong[i] != lca;i=nx(i)){
if(belong[nx(i)] != lca) fa[nx(i)] = link[i];
inBlo[belong[i]] = inBlo[belong[link[i]]] = true;
}
for(rg i=y;belong[i] != lca;i=nx(i)){
if(belong[nx(i)] != lca) fa[nx(i)] = link[i];
inBlo[belong[i]] = inBlo[belong[link[i]]] = true;
}
#undef nx
if(belong[x] != lca) fa[x] = y;
if(belong[y] != lca) fa[y] = x;
rep(i,1,n) if(inBlo[belong[i]]){
belong[i] = lca;
if(!inq[i]) inq[q[++r] = i] = true;
}
}
inline void modify(int s){
int x,y,z = s;
while(z){
y = fa[z];x = link[y];
link[y] = z;link[z] = y;
z = x;
}
}
inline void bfs(int s){
rep(i,0,n){
fa[i] = inq[i] = 0;
belong[i] = i;
}
l = 0;r = -1;q[++r] = s;
inq[s] = true;
while(l <= r){
int u = q[l++];
rep(v,1,n){
if(map[u][v] == 0 || belong[u] == belong[v] || link[u] == v) continue;
if(s == v || link[v] && fa[link[v]]) bloom(u,v);
else if(fa[v] == 0){
fa[v] = u;
if(link[v] != 0){
q[++r] = link[v];
inq[link[v]] = true;
}else{
modify(v);
return ;
}
}
}
}return ;
}
int main(){
read(n);int u,v;
while(scanf("%d%d",&u,&v) != EOF){
map[u][v] = map[v][u] = true;
}
rep(i,1,n) if(link[i] == 0) bfs(i);
int ans = 0;
rep(i,1,n) if(link[i] != 0) ++ ans;
printf("%d\n",ans);
rep(i,1,n){
if(link[i] > i) printf("%d %d\n",i,link[i]);
}
return 0;
}
[Ural1099]工作安排 带花树的更多相关文章
- URAL1099 Work Scheduling —— 一般图匹配带花树
题目链接:https://vjudge.net/problem/URAL-1099 1099. Work Scheduling Time limit: 0.5 secondMemory limit: ...
- URAL1099. Work Scheduling(一般图匹配带花树开花算法)
1099. Work Scheduling Time limit: 0.5 second Memory limit: 64 MB There is certain amount of night gu ...
- [转]带花树,Edmonds's matching algorithm,一般图最大匹配
看了两篇博客,觉得写得不错,便收藏之.. 首先是第一篇,转自某Final牛 带花树……其实这个算法很容易理解,但是实现起来非常奇葩(至少对我而言). 除了wiki和amber的程序我找到的资料看着都不 ...
- kuangbin带你飞 匹配问题 二分匹配 + 二分图多重匹配 + 二分图最大权匹配 + 一般图匹配带花树
二分匹配:二分图的一些性质 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j ...
- URAL 1099. Work Scheduling (一般图匹配带花树)
1099. Work Scheduling Time limit: 0.5 secondMemory limit: 64 MB There is certain amount of night gua ...
- 【BZOJ】【2245】【SDOI2011】工作安排
网络流/费用流 裸题吧……直接建模就好了……所谓的“分段函数”就是吓唬你的,其实就是对于每个人分开建几条流量不同.费用不同的弧而已. 对每种产品,连S->i ,(c[i],0):对每个工作人员 ...
- lemon OA 下阶段工作安排
lemon OA 下阶段工作安排 经验总结 lemon OA系统作为一个中型的java web系统,在架构上还是有着很好地可学习的地方.但是由于经验不足,过程比较迂回.如果真的有经验的话,应该可以做到 ...
- BZOJ1572: [Usaco2009 Open]工作安排Job
1572: [Usaco2009 Open]工作安排Job Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 775 Solved: 337[Submit ...
- bzoj 2245 [SDOI2011]工作安排(最小费用最大流)
2245: [SDOI2011]工作安排 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1197 Solved: 580[Submit][Statu ...
随机推荐
- windows10系统自带输入法不能切换中文如何解决
具体如下: 1.打开计算机管理软件,右击“开始”按钮,在弹出的菜单中选择“计算机管理”: 2.或在桌面右击“此电脑”图标,在弹出的菜单中选择“管理”: 3.在打开的计算机管理软件中,选择“系统工具”- ...
- spring mvc中的@PathVariable
spring mvc中的@PathVariable是用来获得请求url中的动态参数的,十分方便,复习下: @Controller public class TestController { @Requ ...
- iphone传感器
传感器 什么是传感器 传感器是一种感应\检测装置, 目前已经广泛应用于智能手机上 传感器的作用 用于感应\检测设备周边的信息 不同类型的传感器, 检测的信息也不一样 iPhone中的下面现象都是由传感 ...
- 【python】-- 类的继承(新式类/经典类)、多态
继承 之前我们说到了类的公有属性和类的私有属性,其实就是类的封装,现在准备随笔的 是继承,是面向对象的第二大特性. 面向对象编程 (OOP) 语言的一个主要功能就是“继承”.继承是指这样一种能力:它可 ...
- iOS 字符串截取,将字符串中用括号包含的内容去除
//去除字符串中用括号括住的位置 -(NSString *)handleStringWithString:(NSString *)str{ NSMutableString * muStr = [NSM ...
- Linux c编程:线程属性
前面介绍了pthread_create函数,并且当时的例子中,传入的参数都是空指针,而不是指向pthread_attr_t结构的指针.可以使用pthread_attr_t结构修改线程默认属性,并把这些 ...
- vim vimdiff diff 使用及命令
vim: vim 从 vim7 开始加入了多标签切换的功能, 相当于多窗口. 之前的版本虽然也有多文件编辑功能, 但是总之不如这个方便啦.用法::tabnew [++opt选项] [+cmd] 文件 ...
- 怎么在js里写html
<html> <head> <meta charset="utf-8"/> <title>示例前端模板写在代码里</title ...
- 【Flask模板】include标签
# include标签:1. 这个标签相当于是直接将指定的模版中的代码复制粘贴到当前位置.2. `include`标签,如果想要使用父模版中的变量,直接用就可以了,不需要使用`with context ...
- <开源项目分析>Cisco的开源视频加解码器THOR(H.264解码)
原创博客,转载请联系博主! 题外话:自学了快两个月的Perl语言,本来打算写两篇基础介绍的博文来科普一下一些小技巧,但是仔细想想还是没有必要了吧,毕竟现在无论是在用Perl5还是Perl6的人都是小众 ...