P6113-[模板]一般图最大匹配【带花树】
正题
题目链接:https://www.luogu.com.cn/problem/P6113
题目大意
给出一张无向图,求最大匹配。
1≤n≤103,1≤m≤5×1041\leq n\leq 10^3,1\leq m\leq 5\times 10^41≤n≤103,1≤m≤5×104
解题思路
带花树的模板,我也不会讲/kel
所以看下面两篇大佬的博客吧
yyb-带花树算法学习笔记
Bill Yang-带花树学习笔记
时间复杂度好像是O(n3)O(n^3)O(n3)的
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1010,M=3e5+10;
struct node{int to,next;
}a[M];
int n,m,tot,tk,ans,ls[N],dfn[N];
int fa[N],pre[N],tag[N],match[N];
queue<int> q;
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
int find(int x)
{return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
int LCA(int x,int y){++tk;x=find(x);y=find(y);while(dfn[x]!=tk){dfn[x]=tk;x=find(pre[match[x]]);if(y)swap(x,y);}return x;
}
void Blossom(int x,int y,int lca){while(find(x)!=lca){pre[x]=y;y=match[x];if(tag[y]==2){tag[y]=1;q.push(y);}fa[x]=fa[y]=lca;x=pre[y];}return;
}
int Aug(int s){memset(tag,0,sizeof(tag));memset(pre,0,sizeof(pre));for(int i=1;i<=n;i++)fa[i]=i;while(!q.empty())q.pop();q.push(s);tag[s]=1;while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(!tag[y]){tag[y]=2;pre[y]=x;if(!match[y]){for(int u=y,lst;u;u=lst)lst=match[pre[u]],match[u]=pre[u],match[pre[u]]=u;return 1;}tag[match[y]]=1;q.push(match[y]);}else if(tag[y]==1&&find(y)!=find(x)){int lca=LCA(x,y);Blossom(x,y,lca);Blossom(y,x,lca);}}}return 0;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}for(int i=1;i<=n;i++)if(!match[i])ans+=Aug(i);printf("%d\n",ans);for(int i=1;i<=n;i++)printf("%d ",match[i]);return 0;
}
P6113-[模板]一般图最大匹配【带花树】相关推荐
- URAL - 1099 Work Scheduling(一般图最大匹配-带花树模板)
题目链接:点击查看 题目大意:给出n个警卫,接下来给出数个关系,表示两个警卫可以互相配合,现在规定只有可以互相配合的警卫才能留下来继续工作,问最多能有多少个警卫留下来工作,输出匹配方案 题目分析:一般 ...
- 【学习小记】一般图最大匹配——带花树算法
Text 一般图的最大匹配仍然是基于寻找增广路的 增广路的定义是这样的一条路径,它不经过重复的点,并且路径两端均没有匹配,且整条路径是非匹配边-匹配边-非匹配边这样交错的. 类比二分图最大匹配的增广路 ...
- 一般图最大匹配——带花树
所谓花,就是如下图所示的一个奇环: 本文中粗边代表现在的匹配边,细边代表该点的前驱(后文会讲解前驱是什么,现在只需要知道每个点和它的前驱在原图中一定是有边的). 如图所示,一朵包含\(2k+1\)个点 ...
- 2020牛客多校第1场I-1 or 2一般图最大匹配带花树
链接:https://ac.nowcoder.com/acm/contest/5666/I Bobo has a graph with n vertices and m edges where the ...
- uoj79 一般图最大匹配 带花树学习(被虐
辣鸡蒟蒻原来的blog: http://www.elijahqi.win/2018/01/28/uoj79/ 学习资料其一:http://www.csie.ntnu.edu.tw/~u91029/Ma ...
- 模板 - 一般图最大匹配(带花树)
整理的算法模板合集: ACM模板 目录 题目描述 给出一张 n 个点 m 条边的无向图,求该图的最大匹配. 总结一下带花树算法的流程 1.每次找一个未匹配的点出来增广 2.在增广过程中,如果相邻点是白 ...
- Boke and Tsukkomi——一般图匹配+带花树算法
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4687 A new season of Touhou M-1 Grand Prix is approach ...
- HDU - 4687 Boke and Tsukkomi(一般图最大匹配-带花图)
题目链接:点击查看 题目大意:给出n个人和m对匹配,现在问有多少组匹配是不必要的,按照升序输出答案 题目分析:因为题目给的N比较小,所以一开始我的想法是先计算出最大匹配,而后枚举每一条边被删除,然后计 ...
- Joining Byte Blocks(哈希+带花树)
题目链接 Problem Statement As you are probably aware, the Internet protocols specify a canonical byte or ...
- luogu P6113 【模板】一般图最大匹配(带花树)
整理的算法模板合集: ACM模板 总结一下带花树算法的流程 1.每次找一个未匹配的点出来增广 2.在增广过程中,如果相邻点是白点,或者是同一朵花中的节点,则直接跳过这个点 3.如果相邻点是一个未被匹配 ...
最新文章
- Kali Linux常用服务配置教程获取IP地址
- Javascript 面向对象编程初探(一)--- 封装
- Robotium todolist.test.testcases.logout
- Jmeter(7)调试工具---HTTP Mirror Server
- Android开发之在任意Activity在广点通页面添加自定义布局在穿山甲页面添加任意布局
- 画图调子图间距_好看好用的桥梁工程图,你值得拥有!
- Android Studio之提示Unable to delete directory ‘*****\MyApplication\app\build‘
- BLE4.0教程四 新增特征值(CC2541)
- mysql5.5 免编译安装及脚本启动报错深入
- xmlhttp资料(收集)
- 3.8 51单片机-M74HC138译码器驱动8位数码管
- 《激荡三十年》十九、脚下的路——对中国经济未来的猜想
- java的一些学习网址。。。。。
- 5年内在豫投资超30亿元 重点助力河南智慧城市运营
- 服务器支持安装显卡吗,如何在2U服务器里装显卡
- ChatGPT所有插件详细教程
- linux主板上的网卡不显示,linux服务器更换主板后无法识别网卡解决办法
- Dev-C++5.11实现愤怒的小鸟
- 设计模式之结构型模型
- 下载安装指定版本的pandas
热门文章
- 生产者消费者_【线程通信】生产者消费者模型
- python版本差异_python的版本的差别 2,3
- linux cpu softirq,linux softirq机制
- java .this的用法_JAVA中this用法小结
- java 运行环境注册表_Java运行环境与Windows注册表
- 俄语使用计算机怎么说,计算机俄语常用词汇
- tensorrt轻松部署高性能dnn推理_部署环境之:tensorRT的插件
- html怎么防止表单重复提交,js防止表单重复提交的解决方法
- linux配置文件引用时间,linux时间设置、screen使用、命令分类、hash作用、命令引用及history命令...
- 达梦数据查询编码_查询数据库的编码方式