Ural1099 Work Scheduling 一般图的最大匹配
给定无向图, 求最大匹配。
在寻找增广路的过程中,可能出现一个奇环,这时候把奇环收缩,成为一朵“花”,并在新图上继续增广。
为了记录匹配关系,需要在花中寻找路径,每一条增广路径都可以通过把“花”展开还原回去(因为一个奇环上的两段路径必然一奇一偶)
给出代码,,理解不了就当模版吧 类似的算法还有朱刘算法
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=250,maxe=250*250*2;
bool g[maxn][maxn],inq[maxn],inflower[maxn];
int match[maxn],pre[maxn],color[maxn];
deque<int>Q;
int findlca(int u,int v)
{
memset(inq,0,sizeof(inq));
while(1)
{
u=color[u];
inq[u]=true;
if(match[u]==-1)break;
u=pre[match[u]];
}
while(1)
{
v=color[v];
if(inq[v])return v;
v=pre[match[v]];
}
}
void reset(int u,int lca)//以“花魁”为root重新设置路径
{
while(u!=lca)
{
int v=match[u];
inflower[color[u]]=inflower[color[v]]=true;
v=pre[v];
if(color[v]!=lca)pre[v]=match[u];
u=v;
}
}
void contract (int u,int v,int n)
{
int lca=findlca(u,v);
memset(inflower,0,sizeof(inflower));
reset(u,lca);reset(v,lca);
if(color[u]!=lca)pre[u]=v;
if(color[v]!=lca)pre[v]=u;
for(int i=1;i<=n;i++)
{
if(inflower[color[i]])
{
color[i]=lca;
if(!inq[i])
{
Q.push_back(i);
inq[i]=1;
}
}
}
}
bool dfs(int S,int n)
{
for(int i=0;i<=n;i++)pre[i]=-1,inq[i]=0,color[i]=i;
Q.clear();Q.push_back(S);inq[S]=1;
while(!Q.empty())
{
int u=Q.front();Q.pop_front();
for(int v=1;v<=n;v++)
{
if(g[u][v]&&color[v]!=color[u]&&match[u]!=v)
{
if(v==S||(match[v]!=-1&&pre[match[v]]!=-1))
contract(u,v,n);
else if(pre[v]==-1)
{
pre[v]=u;
if(match[v]!=-1)Q.push_back(match[v]),inq[match[v]]=1;
else
{
u=v;
while(u!=-1)
{
v=pre[u];
int w=match[v];
match[u]=v;
match[v]=u;
u=w;
}
return true;
}
}
}
}
}
return false;
}
int main()
{
int n,m,a,b,ans,i;
while(scanf("%d",&n)!=EOF)
{
ans=0;
memset(match,-1,sizeof(match));
memset(g,0,sizeof(g));
while(scanf("%d%d",&a,&b)!=EOF&&a!=0)
{
g[a][b]=g[b][a]=1;
}
for(i=1;i<=n;i++)
{
if(match[i]==-1&&dfs(i,n))
{
ans++;
}
}
cout<<ans*2<<endl;
for(i=1;i<=n;i++)
if(match[i]!=-1)
{
printf("%d %d\n",i,match[i]);
match[i]=match[match[i]]=-1;
}
}
return 0;
}
Ural1099 Work Scheduling 一般图的最大匹配的更多相关文章
- URAL1099 Work Scheduling —— 一般图匹配带花树
题目链接:https://vjudge.net/problem/URAL-1099 1099. Work Scheduling Time limit: 0.5 secondMemory limit: ...
- URAL 1099 Work scheduling 一般图的最大匹配 带花树算法(模板)
R - Work scheduling Time Limit:500MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- URAL 1099 Work Scheduling (一般图最大匹配) 模板题【带花树】
<题目链接> <转载于 >>> > 题目大意: 给出n个士兵,再给出多组士兵之间两两可以匹配的关系.已知某个士兵最多只能与一个士兵匹配.求最多能够有多少对匹 ...
- URAL1099. Work Scheduling(一般图匹配带花树开花算法)
1099. Work Scheduling Time limit: 0.5 second Memory limit: 64 MB There is certain amount of night gu ...
- POJ 2226 缩点建图+二分图最大匹配
这个最小覆盖但不同于 POJ 3041,只有横或者竖方向连通的点能用一块板子覆盖,非连续的,就要用多块 所以用类似并查集方法,分别横向与竖向缩点,有交集的地方就连通,再走一遍最大匹配即可 一开始还有点 ...
- [转]带花树,Edmonds's matching algorithm,一般图最大匹配
看了两篇博客,觉得写得不错,便收藏之.. 首先是第一篇,转自某Final牛 带花树……其实这个算法很容易理解,但是实现起来非常奇葩(至少对我而言). 除了wiki和amber的程序我找到的资料看着都不 ...
- 【Learning】带花树——一般图最大匹配
一般图最大匹配--带花树 问题 给定一个图,求该图的最大匹配.即找到最多的边,使得每个点至多属于一条边. 这个问题的退化版本就是二分图最大匹配. 由于二分图中不存在奇环,偶环对最大匹配并无 ...
- 【learning】一般图最大匹配——带花树
问题描述 对于一个图\(G(V,E)\),当点对集\(S\)满足任意\((u,v)\in S\),均有\(u,v\in V,(u,v)\in E\),且\(S\)中没有点重复出现,我们称\(S\) ...
- "《算法导论》之‘图’":不带权二分图最大匹配(匈牙利算法)
博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利 ...
随机推荐
- LeetCode(47)Permutations II
题目 Given a collection of numbers that might contain duplicates, return all possible unique permutati ...
- jz2440开发板烧写裸板
前提:手头没有openjtag,电脑上没有并口, 实现方法:jlink下载,nor上的uboot下载 关键点是用jlink下载uboot 1,使用jlink进行烧写,其中注意的是jlink只能烧写no ...
- windows下mysql使用实录
之前密码忘了,卸载重装,配置好环境变量,登录,成功 操作命令可参考http://www.runoob.com/mysql/mysql-tutorial.html 这里只列举了我需要用到的命令 登录:m ...
- C51 中断 个人笔记
总架构图 IE寄存器 控制各个中断源的屏蔽与允许 TCON寄存器 各个中断源的请求标志位&有效信号的规定 中断源及其优先级 中断号写程序的时候要用 CPU处理中断三原则 1.CPU同时接收到几 ...
- Android OkHttp与物理存储介质缓存:DiskLruCache(2)
Android OkHttp与物理存储介质缓存:DiskLruCache(2) 本文在附录文章8,9的基础之上,把Android OkHttp与DiskLruCache相结合,综合此两项技术,实 ...
- AjaxFileUpload文件上传组件(php+jQuery+ajax)
jQuery插件AjaxFileUpload可以实现ajax文件上传,下载地址:http://www.phpletter.com/contents/ajaxfileupload/ajaxfileupl ...
- C#高级编程第9版 第一章 .NET体系结构 读后笔记
.NET的CLR把源代码编译为IL,然后又把IL编译为平台专用代码. IL总是即时编译的,这一点的理解上虽然明白.当用户操作C#开发的软件时,应该是操作已经编译好的程序.那么此时安装在客户机上的程序是 ...
- POJ 2135_Farm Tour
题意: 从出发点到目的地往返一次,道路i连接着ai号和bi号,长度为ci.同一条路只能走一次,求最小路径长度. 分析: 如果没有往返,那么就是简单的最短路问题.如果规定严格从左到右,那么就是简单的双调 ...
- codevs 3164 质因数分解
3164 质因数分解 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description (多数据)给出t个数,求出它的质因子个 ...
- 详解ORACLE数据库的分区表
此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性 ...