题目链接:点击查看

题目大意:给出n个警卫,接下来给出数个关系,表示两个警卫可以互相配合,现在规定只有可以互相配合的警卫才能留下来继续工作,问最多能有多少个警卫留下来工作,输出匹配方案

题目分析:一般图最大匹配问题,带花树算法,菜鸡只会用模板,贴一个大佬的博客:

https://www.cnblogs.com/owenyu/p/6858508.html

拿了个模板,暂时凑活用吧,关于用法,solve会返回最大匹配数,match[x]与x为有效匹配,对于这个题目,匹配完后set去重一波输出即可

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=505;const int M=N*N*2;int n,m,que[M],ql,qr,pre[N],tim=0;struct edge
{int v,nxt;
}e[M];int h[N],tot=0;int match[N],f[N],tp[N],tic[N];int find(int x)
{return f[x]==x?f[x]:f[x]=find(f[x]);
}void addedge(int u,int v)
{e[++tot]=(edge){v,h[u]};h[u]=tot;
}int lca(int x,int y)
{for (++tim;;swap(x,y)) if(x) {x=find(x);if(tic[x]==tim) return x; else {tic[x]=tim;x=pre[match[x]];}}
}void shrink(int x,int y,int p)
{while(find(x)!=p) {pre[x]=y;y=match[x];if(tp[y]==2) {tp[y]=1;que[++qr]=y;}if(find(x)==x) f[x]=p;if(find(y)==y) f[y]=p;x=pre[y];}
}bool aug(int s)
{for(int i=1;i<=n;++i) f[i]=i;memset(tp,0,sizeof tp);memset(pre,0,sizeof pre);tp[que[ql=qr=1]=s]=1; // 1: type A ; 2: type Bint t=0;while(ql<=qr) {int x=que[ql++];for(int i=h[x],v=e[i].v;i;i=e[i].nxt,v=e[i].v) {if(find(v)==find(x)||tp[v]==2) continue; if(!tp[v]) {tp[v]=2;pre[v]=x;if(!match[v]) {for(int now=v,last,tmp;now;now=last) {last=match[tmp=pre[now]];match[now]=tmp,match[tmp]=now;}return true;} tp[match[v]]=1,que[++qr]=match[v];} else if(tp[v]==1) {int l=lca(x,v);shrink(x,v,l);shrink(v,x,l);}}}   return false;
}int solve()
{int ans=0;for(int i=1;i<=n;i++)if(!match[i]&&aug(i))ans++;return ans;
}void init()
{tot=0;memset(match,0,sizeof(match));memset(tic,0,sizeof(tic));memset(h,0,sizeof(h));
}int main()
{
//  freopen("input.txt","r",stdin);init();scanf("%d",&n);int u,v;while(scanf("%d%d",&u,&v)!=EOF){addedge(u,v);addedge(v,u);}solve();set<pair<int,int>>ans;for(int i=1;i<=n;i++)if(match[i])ans.insert(make_pair(min(i,match[i]),max(i,match[i])));printf("%d\n",2*ans.size());for(auto it:ans)printf("%d %d\n",it.first,it.second);return 0;
}

URAL - 1099 Work Scheduling(一般图最大匹配-带花树模板)相关推荐

  1. 【学习小记】一般图最大匹配——带花树算法

    Text 一般图的最大匹配仍然是基于寻找增广路的 增广路的定义是这样的一条路径,它不经过重复的点,并且路径两端均没有匹配,且整条路径是非匹配边-匹配边-非匹配边这样交错的. 类比二分图最大匹配的增广路 ...

  2. 一般图最大匹配——带花树

    所谓花,就是如下图所示的一个奇环: 本文中粗边代表现在的匹配边,细边代表该点的前驱(后文会讲解前驱是什么,现在只需要知道每个点和它的前驱在原图中一定是有边的). 如图所示,一朵包含\(2k+1\)个点 ...

  3. 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 ...

  4. uoj79 一般图最大匹配 带花树学习(被虐

    辣鸡蒟蒻原来的blog: http://www.elijahqi.win/2018/01/28/uoj79/ 学习资料其一:http://www.csie.ntnu.edu.tw/~u91029/Ma ...

  5. Boke and Tsukkomi——一般图匹配+带花树算法

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4687 A new season of Touhou M-1 Grand Prix is approach ...

  6. HDU - 4687 Boke and Tsukkomi(一般图最大匹配-带花图)

    题目链接:点击查看 题目大意:给出n个人和m对匹配,现在问有多少组匹配是不必要的,按照升序输出答案 题目分析:因为题目给的N比较小,所以一开始我的想法是先计算出最大匹配,而后枚举每一条边被删除,然后计 ...

  7. Joining Byte Blocks(哈希+带花树)

    题目链接 Problem Statement As you are probably aware, the Internet protocols specify a canonical byte or ...

  8. [转]带花树,Edmonds's matching algorithm,一般图最大匹配

    看了两篇博客,觉得写得不错,便收藏之.. 首先是第一篇,转自某Final牛 带花树--其实这个算法很容易理解,但是实现起来非常奇葩(至少对我而言). 除了wiki和amber的程序我找到的资料看着都不 ...

  9. luogu P4258 [WC2016]挑战NPC(一般图的最大匹配,带花树,建图、拆点技巧)

    整理的算法模板合集: ACM模板 luogu P4258 [WC2016]挑战NPC 如果是一堆球一堆筐,每一个筐里只能放一个球,求最大能放多少个球, 那么就是一个二分图的最大匹配问题,非常简单,我们 ...

最新文章

  1. 【Rsync项目实战一】备份全网服务器数据
  2. 服务器系统需要定期清理吗,windows 2008服务器系统清理
  3. 最后一次团队作业——总结
  4. scikit-learn——快速入门
  5. python ftplib下载文件封装
  6. vbs比较两个数组里的数的大小_BAT 高频面试题:寻找两个有序数组的中位数
  7. 程序员要么在变来变去中成长,要么在变来变去中被淘汰,要么主动去适应变来边去的事实...
  8. GB2312和ASCII码点阵字库HZK, ASC整理
  9. 阿里云配置 https
  10. c语言oj查重,GitHub - shawnsky/hshe: Online Judge System 在线评测系统 代码查重 作业质量...
  11. Edge在IE模式下加载网页 - Edge设置IE兼容性
  12. java406错误_Springmvc报406错误(Not Acceptable)的有效解决方法
  13. MQ系列SpringBoot快速整合RabbitMQ
  14. 【Java】GUI图形化界面中,setBounds()中参数的含义
  15. isdigit()函数如何判断负数
  16. 【Linux】IRQ
  17. JAVA 输出 1 3 6 10 15 ....
  18. synology nfs_如何为您的Synology NAS创建本地备份
  19. java 关键字6,【JAVA SE基础篇】6.开始前的一些规定以及关键字
  20. CSU1020-真三国无双-模拟

热门文章

  1. SpringSecurity常用过滤器介绍
  2. RabbitMQ死信队列代码架构图
  3. Channel 与ChannelPipeline
  4. SpringMVC的请求-获得请求参数-获得集合类型参数1
  5. 文件上传之Springmvc方式上传原理分析
  6. Stream流中的常用方法_limit
  7. Concurrent集合 Atomic类
  8. FastDFS简介和安装
  9. c语言小游戏贪吃神,[原创]自己编的一个贪吃蛇小游戏
  10. oracle字段重复新增错误,Oracle 判断表或字段是否存在新增/修改表结构可重复执行sql...