<题目链接>

<转载于 >>>  >

题目大意:
 给出n个士兵,再给出多组士兵之间两两可以匹配的关系。已知某个士兵最多只能与一个士兵匹配。求最多能够有多少对匹配,并输出这些匹配。

解题分析:
本题不一定是二分图,所以求最大匹配不能用匈牙利,因为该一般图可能出现奇环。本题用带花树求解,下面是带花树的模板。

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
#define MAXE 250*250*2
#define MAXN 250
#define SET(a,b) memset(a,b,sizeof(a))
deque<int> Q;
//g[i][j]存放关系图:i,j是否有边,match[i]存放i所匹配的点
bool g[MAXN][MAXN],inque[MAXN],inblossom[MAXN];
int match[MAXN],pre[MAXN],base[MAXN]; //找公共祖先
int findancestor(int u,int v){
bool inpath[MAXN]={false};
while(){
u=base[u];
inpath[u]=true;
if(match[u]==-)break;
u=pre[match[u]];
}
while(){
v=base[v];
if(inpath[v])return v;
v=pre[match[v]];
}
} //压缩花
void reset(int u,int anc){
while(u!=anc){
int v=match[u];
inblossom[base[u]]=;
inblossom[base[v]]=;
v=pre[v];
if(base[v]!=anc)pre[v]=match[u];
u=v;
}
} void contract(int u,int v,int n){
int anc=findancestor(u,v);
memset(inblossom,,sizeof(inblossom));
reset(u,anc);reset(v,anc);
if(base[u]!=anc)pre[u]=v;
if(base[v]!=anc)pre[v]=u;
for(int i=;i<=n;i++)
if(inblossom[base[i]]){
base[i]=anc;
if(!inque[i]){
Q.push_back(i);
inque[i]=;
}
}
} bool dfs(int S,int n){
for(int i=;i<=n;i++)pre[i]=-,inque[i]=,base[i]=i;
Q.clear();Q.push_back(S);inque[S]=;
while(!Q.empty()){
int u=Q.front();Q.pop_front();
for(int v=;v<=n;v++){
if(g[u][v]&&base[v]!=base[u]&&match[u]!=v){
if(v==S||(match[v]!=-&&pre[match[v]]!=-))contract(u,v,n);
else if(pre[v]==-){
pre[v]=u;
if(match[v]!=-)Q.push_back(match[v]),inque[match[v]]=;
else{
u=v;
while(u!=-){
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;
while(scanf("%d",&n)!=EOF){
ans=;
memset(match,-,sizeof(match));
memset(g,,sizeof(g));
while(scanf("%d%d",&a,&b)!=EOF&&a!=){
g[a][b]=g[b][a]=;
}
for(int i=;i<=n;i++){
if(match[i]==-&&dfs(i,n)){
ans++; //ans记录最多有几对匹配
}
}
cout<<ans*<<endl; //输出巡逻的人数
for(int i=;i<=n;i++){
if(match[i]!=-){
printf("%d %d\n",i,match[i]);
match[i]=match[match[i]]=-;
}
}
}
return ;
}

2018-11-19

URAL 1099 Work Scheduling (一般图最大匹配) 模板题【带花树】的更多相关文章

  1. URAL 1099 Work scheduling 一般图的最大匹配 带花树算法(模板)

    R - Work scheduling Time Limit:500MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  2. URAL 1099. Work Scheduling (一般图匹配带花树)

    1099. Work Scheduling Time limit: 0.5 secondMemory limit: 64 MB There is certain amount of night gua ...

  3. Ural 1099 Work Scheduling

    http://acm.timus.ru/problem.aspx?space=1&num=1099 题意:有n个人,很多对合作关系,每个人只能和一个人合作,求最多能选出多少人. 一般图匹配 # ...

  4. HDU 2389 Rain on your Parade 最大匹配(模板题)【HK算法】

    <题目链接> 题目大意:有m个宾客,n把雨伞,预计时间t后将会下大雨,告诉你每个宾客的位置和速度,每把雨伞的位置,问你最多几个宾客能够拿到伞. 解题分析: 本题就是要我们求人与伞之间的最大 ...

  5. [WC2016]挑战NPC(一般图最大匹配)

    [WC2016]挑战NPC(一般图最大匹配) Luogu 题解时间 思路十分有趣. 考虑一个筐只有不多于一个球才有1的贡献代表什么. 很明显等效于有至少两个位置没有被匹配时有1的贡献. 进而可以构造如 ...

  6. 【模板】一般图最大匹配(带花树算法)/洛谷P6113

    题目链接 https://www.luogu.com.cn/problem/P6113 题目大意 给定一个 \(n\) 个点 \(m\) 条边的无向图,求该图的最大匹配. 题目解析 二分图最大匹配,一 ...

  7. 【UOJ #79】一般图最大匹配 带花树模板

    http://uoj.ac/problem/79 带花树模板,做法详见cyb的论文或fhq的博客. 带花树每次对一个未盖点bfs增广,遇到奇环就用并查集缩环变成花(一个点),同时记录每个点的Next( ...

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

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

  9. URAL1099. Work Scheduling(一般图匹配带花树开花算法)

    1099. Work Scheduling Time limit: 0.5 second Memory limit: 64 MB There is certain amount of night gu ...

随机推荐

  1. maven install 报错 No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

    1.控制台打印信息 [INFO] Scanning for projects... [INFO] [INFO] ---------------------< org.cqupt.mauger:R ...

  2. Guideline 5.2.1 - Legal - Intellectual Property 解决方案

    最近在上架公司公司项目的时候遇到这个问题什么5.2.1 然后去了解发现最近不少人都遇到了这个问题.先说一下 我上架的APP是一个医疗的APP然后说需要什么医疗资质,估计是账号的公司资质不够吧.后面和苹 ...

  3. Flex布局新旧混合写法详解

    flex是个非常好用的属性,如果说有什么可以完全代替 float 和 position ,那么肯定是非它莫属了(虽然现在还有很多不支持 flex 的浏览器).然而国内很多浏览器对 Flex 的支持都不 ...

  4. MobileNet V2

    https://zhuanlan.zhihu.com/p/33075914 http://blog.csdn.net/u011995719/article/details/79135818 https ...

  5. SpringBoot事务管理

    1.在UserMapper接口中添加更新和删除方法 package com.cppdy.mapper; import org.apache.ibatis.annotations.Delete; imp ...

  6. laravel 框架后台主菜单接口

    后台菜单调用接口:/admin/manages ManageRepository类: 每个路由中注册: 等等: 最后后台菜单返回:

  7. Kali安装问题解决方案

    一.对今天安装Kalilinux  失败的原因做一个简单的总结, 1.安装之前的电脑状况,电脑配置Windows7 64位旗舰版配置,虚拟版本是VMware Workstation Pro14 ver ...

  8. 爬虫----beautifulsoup的简单使用

    beautifulSoup使用: 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据. pip3 install beautifulsoup4 解析器 Beau ...

  9. WIN7 启动屏幕键盘

    点击“开始”或按快捷键“WIN”,输入“osk”后,按“回车键”确定,就可以启动屏幕键盘. 屏幕键盘 另一种方法是进入“控制面板”: 再进入“轻松访问中心”: 选择“启动屏幕键盘”,这样也可以启动屏幕 ...

  10. SqlServerHelp

    using System; using System.Collections.Generic; using System.Reflection; using System.Text; using Sy ...