UOJ #79 一般图最大匹配 带花树
一般图和二分图的区别就是有奇环,带花树是在匈牙利算法的基础上对奇环进行缩点操作,复杂度似乎是O(mn)和匈牙利一样。
具体操作是一个一个点做类似匈牙利的找增广路操作,每次将一个点作为根(染成白色),然后向下bfs黑白染色,两个白点相邻时将这两个白点缩到割顶成一个点(用并查集维护一下)(匈牙利算法也是只用白点找增广,黑点相当于重复计算了没有意义),然后把奇环里所有黑点视为白点放到队列里bfs。
设置一个pre数组记录返回的路径(因为bfs的方向和匈牙利是相反的所以最后找到的时候再顺着返回的路径重新匹配),因为重新匹配的时候找的是可匹配的黑点,所以在dfs的时候只用给每个黑点设置pre,产生奇环的时候再对白点设置pre,因为此时奇环里的点匹配之后才能决定颜色(黑白都可以)。
这个算法,有一丶丶恶心。
原理详解:https://blog.csdn.net/u014261987/article/details/41249385
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
#define LL long long
const int maxn=;
const int mmm=;
int n,m;
struct nod{
int y,next;
}e[maxn];
int head[mmm]={},q[maxn]={},tl=,tr=,tot=;
int fa[mmm]={},tp[mmm]={},pre[mmm]={},d[mmm]={},bel[mmm]={},tly=;
void init(int x,int y){e[++tot].y=y;e[tot].next=head[x];head[x]=tot;}
inline int getfa(int x){
return fa[x]==x?x:fa[x]=getfa(fa[x]);
}
inline int lca(int x,int y){
++tly;
for(;;){
if(x){
x=getfa(x);
if(bel[x]==tly)return x;
else {bel[x]=tly;x=pre[d[x]];}
}
swap(x,y);
}
}
inline void mlink(int x,int y,int pa){
while(getfa(x)!=pa){
pre[x]=y;y=d[x];
if(tp[y]==){tp[y]=;q[++tr]=y;}
if(getfa(x)==x)fa[x]=pa;
if(getfa(y)==y)fa[y]=pa;
x=pre[y];
}
}
int doit(int s){
for(int i=;i<=n;++i)fa[i]=i;
memset(tp,,sizeof(tp));memset(pre,,sizeof(pre));
tl=tr=;q[]=s;tp[s]=;
while(tl<=tr){
int x=q[tl];++tl;
for(int i=head[x];i;i=e[i].next){
int y=e[i].y;
if(getfa(x)==getfa(y)||tp[y]==)continue;
if(!tp[y]){
tp[y]=;pre[y]=x;
if(!d[y]){
for(int now=y,las,j;now;now=las){
j=pre[now]; las=d[pre[now]];
d[now]=j;d[j]=now;
}
return ;
}
tp[d[y]]=;q[++tr]=d[y];
}
else{
int pa=lca(x,y);
mlink(x,y,pa);mlink(y,x,pa);
}
}
}return ;
}
int main(){
scanf("%d%d",&n,&m);
int x,y;
for(int i=;i<m;++i){scanf("%d%d",&x,&y);init(x,y);init(y,x);}
int ans=;
for(int i=;i<n;++i){if(!d[i])ans+=doit(i);}
printf("%d\n",ans);
for(int i=;i<=n;++i)if(d[i])d[d[i]]=i;
for(int i=;i<=n;++i){
printf("%d ",d[i]);
}printf("\n");
return ;
}
UOJ #79 一般图最大匹配 带花树的更多相关文章
- HDOJ 4687 Boke and Tsukkomi 一般图最大匹配带花树+暴力
一般图最大匹配带花树+暴力: 先算最大匹配 C1 在枚举每一条边,去掉和这条边两个端点有关的边.....再跑Edmonds得到匹配C2 假设C2+2==C1则这条边再某个最大匹配中 Boke and ...
- ZOJ 3316 Game 一般图最大匹配带花树
一般图最大匹配带花树: 建图后,计算最大匹配数. 假设有一个联通块不是完美匹配,先手就能够走那个没被匹配到的点.后手不论怎么走,都必定走到一个被匹配的点上.先手就能够顺着这个交错路走下去,最后一定是后 ...
- 【UOJ #79】一般图最大匹配 带花树模板
http://uoj.ac/problem/79 带花树模板,做法详见cyb的论文或fhq的博客. 带花树每次对一个未盖点bfs增广,遇到奇环就用并查集缩环变成花(一个点),同时记录每个点的Next( ...
- 【UOJ 79】 一般图最大匹配 (✿带花树开花)
从前一个和谐的班级,所有人都是搞OI的.有 n 个是男生,有 0 个是女生.男生编号分别为 1,…,n. 现在老师想把他们分成若干个两人小组写动态仙人掌,一个人负责搬砖另一个人负责吐槽.每个人至多属于 ...
- uoj#79. 一般图最大匹配(带花树)
传送门 带花树 不加证明的说一下过程好了:每次从一个未匹配点\(S\)出发bfs,设\(S\)为\(1\)类点,如果当前点\(v\)在本次bfs中未经过,分为以下两种情况 1.\(v\)是未匹配点,那 ...
- 【learning】一般图最大匹配——带花树
问题描述 对于一个图\(G(V,E)\),当点对集\(S\)满足任意\((u,v)\in S\),均有\(u,v\in V,(u,v)\in E\),且\(S\)中没有点重复出现,我们称\(S\) ...
- 【刷题】UOJ #79 一般图最大匹配
从前一个和谐的班级,所有人都是搞OI的.有 \(n\) 个是男生,有 \(0\) 个是女生.男生编号分别为 \(1,-,n\) . 现在老师想把他们分成若干个两人小组写动态仙人掌,一个人负责搬砖另一个 ...
- UOJ #79. 一般图最大匹配
板子: #include<iostream> #include<cstdio> #include<algorithm> #include<vector> ...
- kuangbin带你飞 匹配问题 二分匹配 + 二分图多重匹配 + 二分图最大权匹配 + 一般图匹配带花树
二分匹配:二分图的一些性质 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j ...
随机推荐
- char *与const char **函数参数传参问题
传参方法 ## 函数 extern void f2 ( const char ** ccc ); const char ch = 'X'; char * ch_ptr; const char ** c ...
- David McCullough, Jr.为韦斯利高中毕业生演讲〈你并不特别〉
Dr. Wong, Dr. Keough, Mrs.Novogroski, Ms. Curran, members of the board of education, familyand frien ...
- awk技巧【转】
转自 awk技巧(如取某一行数据中的倒数第N列等) - 散尽浮华 - 博客园 https://www.cnblogs.com/kevingrace/p/8481965.html 使用awk取某一行数据 ...
- chattr的使用
让某个文件只能往里面追加内容,不能删除,一些日志文件适用于这种操作: chattr +a /home/caolei/.bash_history 查看lsattr /home/caolei/.bash_ ...
- XmlDocument根据节点的属性值获取节点
string targetParm = string.Format("STUDENTS/STUDENT[@NO='{0}']", targetValue);//生成目标获取节点的参 ...
- compile php with openssl on mac osx error 填坑
从源码手动编译 PHP 时出现如下错误: Default 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Undefined symbols for arch ...
- php中相对路径和绝对路径如何使用(详解)
目录 一.总结 一句话总结: 1.php中用用“/”表示根目录么? 2.什么符号表示当前目录(asp,jsp,php都一样)? 3.php中如何使用$_SERVER['DOCUMENT_ROOT']做 ...
- 从html页面中抽取table表格数据
/** * [getDataFromTrElems 获取表格行元素数据] * @param {[Object]} trElems [trs dom] * @param {[String]} type ...
- Laravel firstOrNew 与 firstOrCreate 的区别
例如: $item = App\Deployment::firstOrNew( ['name' => '问答小程序'], ['delayed' => 1] ); firstOrNew 需要 ...
- vue组件库(四):组件功能模块划分
涉及的平台 移动端 一.公共样式 常用变量 var.scss 颜色模块 主题色.状态色.文本色.灰度色(边框和分隔线) 字体 字体.大小.行间距 2.控件 3. 三大模块 样式.有哪些控件