过去做的都是二分图匹配 即 同一个集合里的点 互相不联通

但是如果延伸到一般图上去 求一个一般图的最大匹配 就要用带花树来解决

带花树模板 用来处理一个无向图上的最大匹配 
看了一会还是不懂  抄了一遍kuangbin的模板熟悉了一下

还有一个一般图最大权匹配 保存下来了VFK菊苣的模板题代码当作板子 http://uoj.ac/submission/16359

但愿以后的比赛永远也遇不到 .. 遇到了也能抄对 .. 抄错了也能过 ..

R ural1099

kuangbin模板

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<map>
#include<string>
#include<vector>
#include<queue>
#include<iostream>
using namespace std;
#define L long long
int n ;
bool g[255][255];
int match[255] ;
bool inque[255] , inpath[255] , inblo[255] ;
int head , tail ;
int que[255] ;
int st , fi ;
int newbase ;
int fa[255] , base[255] ;
int cnt ;
void creag(){
int u ,v ;
memset(g , false , sizeof(g)) ;
scanf("%d",&n ) ;
while(scanf("%d%d" , &u , &v) !=EOF){
g[u][v] = g[v][u] = true ;
}
}
void push(int u){
que[tail] = u ;
tail ++ ;
inque[u] = true ;
}
int pop(){
int res = que[head] ;
head ++ ;
return res ;
}
int findca(int u , int v) {
memset(inpath , false , sizeof(inpath)) ;
while(true){
u = base[u];
inpath[u] = true ;
if(u == st)break;
u = fa[match[u]] ;
}
while(true){
v = base[v] ;
if(inpath[v])break;
v = fa[match[v]] ;
}
return v ;
}
void reset(int u ){
int v ;
while(base[u] != newbase ){
v = match[u];
inblo[base[u]] = inblo[base[v]] = true ;
u = fa[v] ;
if(base[u] != newbase )fa[u] = v;
}
}
void blocon(int u , int v ){
newbase = findca(u,v);
memset(inblo , false , sizeof(inblo)) ;
reset(u) ;
reset(v) ;
if(base[u] != newbase )fa[u] = v ;
if(base[v] != newbase )fa[v] = u ;
for(int tu = 1 ;tu <= n ; tu ++ ){
if(inblo[base[tu]]){
base[tu] = newbase ;
if(!inque[tu] )push(tu ) ;
}
}
}
void findatp(){
memset(inque , false , sizeof(inque)) ;
memset(fa , 0 , sizeof(fa)) ;
for(int i = 1; i <= n ; i ++ ){
base[i] = i ;
}
head = tail = 1 ;
push(st) ;
fi = 0 ;
while(head < tail ){
int u = pop() ;
for(int v = 1; v <= n ; v ++ ){
if(g[u][v] && (base[u] != base[v] ) && (match[u ] != v)){
if((v == st) || ((match[v] > 0) && fa[match[v]] > 0) ){
blocon(u,v);
}
else if (fa[v] == 0) {
fa[v] = u ;
if(match[v] > 0) {
push(match[v]) ;
}
else {
fi = v ;
break ;
}
}
}
}
}
}
void ap(){
int u ,v , w ;
u = fi ;
while(u > 0) {
v = fa[u] ;
w = match[v] ;
match[v] = u ;
match[u] = v;
u = w ;
}
}
void edmonds (){
memset(match , 0 ,sizeof(match)) ;
for(int u = 1; u <= n; u ++ ){
if(match[u] == 0) {
st = u ;
findatp() ;
if(fi > 0){
ap() ;
}
}
}
} void print(){
cnt = 0;
for(int u = 1; u <= n ; u ++ ){
if(match[u] > 0)cnt ++ ;
}
printf("%d\n",cnt);
for(int u = 1; u <= n ; u ++ ){
if(u < match[u]) {
printf("%d %d\n",u , match[u]) ;
}
}
}
int main(){
creag();
edmonds() ;
print() ;
}

S hdu4687

给出一群pair 输出那些 不在任何最大匹配中的pair 的编号

不在任何最大匹配的pair 只能是 它的两个端点上 都有必选的pair 所以这个pair不能做相邻pair的替代 因为如果替代 另一个端点上的pair就不能选了

所以 枚举每条边 把这条边的两个端点上的所以边都去掉 如果损失了两个匹配 那么这条边就不在任何一个匹配中

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<map>
#include<string>
#include<vector>
#include<queue>
#include<iostream>
using namespace std;
#define L long long
int n , m ;
bool g[255][255];
int match[255] ;
bool inque[255] , inpath[255] , inblo[255] ;
int head , tail ;
int que[255] ;
int st , fi ;
int newbase ;
int fa[255] , base[255] ;
int cnt ; int input[255][2] ;
int output[255] ; bool bf[255][255] ; void creag(){
int u ,v ;
memset(g , false , sizeof(g)) ;
memset(bf , false , sizeof(bf)) ;
for(int i = 1; i <= m ; i ++ ){
scanf("%d%d",&u,&v);
g[u][v] = g[v][u] = true ;
bf[u][v] = bf[v][u] = true ;
input[i][0] = u ;
input[i][1] = v ;
}
}
void push(int u){
que[tail] = u ;
tail ++ ;
inque[u] = true ;
}
int pop(){
int res = que[head] ;
head ++ ;
return res ;
}
int findca(int u , int v) {
memset(inpath , false , sizeof(inpath)) ;
while(true){
u = base[u];
inpath[u] = true ;
if(u == st)break;
u = fa[match[u]] ;
}
while(true){
v = base[v] ;
if(inpath[v])break;
v = fa[match[v]] ;
}
return v ;
}
void reset(int u ){
int v ;
while(base[u] != newbase ){
v = match[u];
inblo[base[u]] = inblo[base[v]] = true ;
u = fa[v] ;
if(base[u] != newbase )fa[u] = v;
}
}
void blocon(int u , int v ){
newbase = findca(u,v);
memset(inblo , false , sizeof(inblo)) ;
reset(u) ;
reset(v) ;
if(base[u] != newbase )fa[u] = v ;
if(base[v] != newbase )fa[v] = u ;
for(int tu = 1 ;tu <= n ; tu ++ ){
if(inblo[base[tu]]){
base[tu] = newbase ;
if(!inque[tu] )push(tu ) ;
}
}
}
void findatp(){
memset(inque , false , sizeof(inque)) ;
memset(fa , 0 , sizeof(fa)) ;
for(int i = 1; i <= n ; i ++ ){
base[i] = i ;
}
head = tail = 1 ;
push(st) ;
fi = 0 ;
while(head < tail ){
int u = pop() ;
for(int v = 1; v <= n ; v ++ ){
if(g[u][v] && (base[u] != base[v] ) && (match[u ] != v)){
if((v == st) || ((match[v] > 0) && fa[match[v]] > 0) ){
blocon(u,v);
}
else if (fa[v] == 0) {
fa[v] = u ;
if(match[v] > 0) {
push(match[v]) ;
}
else {
fi = v ;
break ;
}
}
}
}
}
}
void ap(){
int u ,v , w ;
u = fi ;
while(u > 0) {
v = fa[u] ;
w = match[v] ;
match[v] = u ;
match[u] = v;
u = w ;
}
}
void edmonds (){
memset(match , 0 ,sizeof(match)) ;
for(int u = 1; u <= n; u ++ ){
if(match[u] == 0) {
st = u ;
findatp() ;
if(fi > 0){
ap() ;
}
}
}
} int print(){
int cnt = 0;
for(int u = 1; u <= n ; u ++ ){
if(match[u] > 0 && u < match[u]){
cnt ++ ;
}
}
return cnt ;
}
int main(){
while(scanf("%d%d" , &n, &m )!=EOF){
creag();
edmonds() ;
int res = print() ;
int ans = 0 ;
for(int i = 1; i <= m; i ++ ){
int u = input[i][0] ;
int v = input[i][1] ;
for(int k = 1; k <= n ; k ++ ){
for(int j = 1; j <= n; j ++ )
g[k][j] = bf[k][j] ;
}
for(int j = 1; j <= n ; j ++ ){
g[j][v] = g[v][j] = g[u][j] = g[j][u] = false ; }
edmonds() ;
int r = print() ;
if(r == res - 2){
ans ++ ;
output[ans] = i ;
}
}
printf("%d\n",ans) ;
for(int i = 1; i <= ans ;i ++ ){
printf("%d",output[i]) ;
if(i != ans)printf(" ") ;
}
printf("\n") ;
}
}

二分图专题总算告一段落了

感觉 现在只会抄模板了 ..

明天...哈理工的最菜的三个选手 我和带我飞我的两个队友要去勇闯ecfinal题了 祝自己好运 ...

[kuangbin带你飞]专题十 匹配问题 一般图匹配的更多相关文章

  1. [kuangbin带你飞]专题十 匹配问题

        A-L 二分匹配 M-O 二分图多重匹配 P-Q 二分图最大权匹配 R-S 一般图匹配带花树 模板请自己找     ID Origin Title   61 / 72 Problem A HD ...

  2. [kuangbin带你飞]专题十 匹配问题 二分匹配部分

    刚回到家 开了二分匹配专题 手握xyl模板 奋力写写写 终于写完了一群模板题 A hdu1045 对这个图进行 行列的重写 给每个位置赋予新的行列 使不能相互打到的位置 拥有不同的行与列 然后左行右列 ...

  3. [kuangbin带你飞]专题十 匹配问题 二分图多重匹配

    二分图的多重匹配问题不同于普通的最大匹配中的"每个点只能有最多一条边" 而是"每个点连接的边数不超过自己的限定数量" 最大匹配所解决的问题一般是"每个 ...

  4. [kuangbin带你飞]专题十 匹配问题 二分图最大权匹配

    二分图最大权匹配有km算法和网络流算法 km算法模板默认解决最大权匹配的问题 而使用最小费用最大流 是解决最小权匹配问题 这两种办法都可以求最大最小权 需要两次取反 TAT 感觉讲km会很难的样子.. ...

  5. [kuangbin带你飞]专题十五 数位DP

            ID Origin Title   62 / 175 Problem A CodeForces 55D Beautiful numbers   30 / 84 Problem B HD ...

  6. [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher 题解报告

    来刷kuangbin字符串了,字符串处理在ACM中是很重要的,一般比赛都会都1——2道有关字符串处理的题目,而且不会很难的那种,大多数时候都是用到一些KMP的性质或者找规律. 点击标题可跳转至VJ比赛 ...

  7. [kuangbin带你飞]专题十四 数论基础

            ID Origin Title   111 / 423 Problem A LightOJ 1370 Bi-shoe and Phi-shoe   21 / 74 Problem B ...

  8. 【算法系列学习】DP和滚动数组 [kuangbin带你飞]专题十二 基础DP1 A - Max Sum Plus Plus

    A - Max Sum Plus Plus https://vjudge.net/contest/68966#problem/A http://www.cnblogs.com/kuangbin/arc ...

  9. [kuangbin带你飞]专题十二 基础DP1

            ID Origin Title   167 / 465 Problem A HDU 1024 Max Sum Plus Plus   234 / 372 Problem B HDU 1 ...

随机推荐

  1. CSS 关于让页面的高度达到电脑屏幕的底部

    .sidebar:before {content: "";display: block;width: 190px;position: fixed;bottom: 0;top: 0; ...

  2. 微信小程序开发遇见的问题之一

    在开发的时候,因为要定位到当前的城市,而小程序提供的API只是能够获取当前的经纬度,所以我们需要通过接入百度地图的API.调接口的时候发现报错,说域名不合法,此时千万不要着急,只要你登录你的微信开发公 ...

  3. 如何理解docker镜像build中的上下文

    参考:https://yeasy.gitbooks.io/docker_practice/content/image/build.html 理解上线文概念非常重要,不然可能碰到一些奇怪的问题. 构建镜 ...

  4. Hystrix属性配置策略

    Hystrix属性配置 Command可配参数 设置隔离策略 execution.isolation.strategy = THREAD 设置超时时间 execution.isolation.thre ...

  5. 烂代码 git blame

    关于烂代码的那些事(上) - Axb的自我修养 http://blog.2baxb.me/archives/1343 关于烂代码的那些事(上) 六月 21, 2015 57 条评论 目录 [显示] 1 ...

  6. TCustomControl绘制自己和图形子控件共四步,TWinControl关键属性方法速记

    TCustomControl = class(TWinControl) private FCanvas: TCanvas; procedure WMPaint(var Message: TWMPain ...

  7. 1、Python request(爬虫-百度翻译)

    #encoding=utf-8 import requests def fanyi(): while True: context = input("请输入翻译的内容(退出q):") ...

  8. Open SQL和Native SQL到底有什么本质的区别

    1.個人愚見:它們只是在实现的方式上,执行效率上不同,有的书上还说native sql存在一定风险 *& 20170521 171300 1.Open sql 是由创建数据库数据的ABAP命令 ...

  9. 4.6 基于STM32+MC20地图显示路径功能

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  10. Java字段初始化规律:

    Java字段初始化规律: Java进行初始化的地方有两个,初始化块和构造函数,其中初始化块又分为静态初始化块和实例初始化块(以上程序为实例初始化块).静态初始化块是类中由static修饰的初始化块,实 ...