匈牙利算法求最大匹配(HDU-4185 Oil Skimming)
如下图:要求最多可以凑成多少对对象

大佬博客:
https://blog.csdn.net/cillyb/article/details/55511666
https://blog.csdn.net/denghecsdn/article/details/77619308
https://www.cnblogs.com/wangjunyan/p/5563154.html
模板:
int link[maxn],vis[maxn];
bool dfs(int x)
{
for(int i = ; i <= num; i++)
{
if(!vis[i] && cp[x][i])
{
vis[i] = ;
if(link[i] == || dfs(link[i]))
{
link[i] = x;
return true;
}
}
}
return false;
} int hunyary()
{
int sum = ;
memset(link, , sizeof(link));
for(int i = ; i <= num; i++)
{
memset(vis, , sizeof(vis));
if(dfs(i))
sum++;
}
return sum;
}
最后的sum值就是最大的匹配值。
水平和竖直的两个‘#’,可以连成一条边,求这样的边最多有多少条。
主要是自己如何去建图:
- 遍历数组mp对‘#’进行标号;
- 再次遍历遇到‘#’,看他上下左右是否有‘#’,有的话在cp数组中进行连线;
- 再利用匈牙利算法求最大匹配。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#define FRE() freopen("in.txt","r",stdin)
#define INF 0x3f3f3f3f using namespace std;
typedef long long ll;
const int maxn = ;
int n,k,cnt = ,num;
char mp[maxn][maxn];
int temp[maxn][maxn],cp[maxn][maxn];
int link[maxn],vis[maxn]; inline void init()
{
memset(temp, , sizeof(temp));
memset(cp, , sizeof(cp));
} bool dfs(int x)
{
for(int i = ; i <= num; i++)
{
if(!vis[i] && cp[x][i])
{
vis[i] = ;
if(link[i] == || dfs(link[i]))
{
link[i] = x;
return true;
}
}
}
return false;
} int hunyary()
{
int sum = ;
memset(link, , sizeof(link));
for(int i = ; i <= num; i++)
{
memset(vis, , sizeof(vis));
if(dfs(i))
sum++;
}
return sum;
} int main()
{
//FRE();
scanf("%d",&k);
while(k--)
{
init();
scanf("%d",&n);
for(int i = ; i < n; i++)
scanf("%s",mp[i]); num = ;
for(int i = ; i < n; i++)
{
for(int j = ; j < n; j++)
{
if(mp[i][j] == '#')
temp[i][j] = ++num;
}
} for(int i = ; i < n; i++)
{
for(int j = ; j < n; j++)
{
if(mp[i][j] == '#')
{
if(i - >= && mp[i-][j] == '#') cp[temp[i][j]][temp[i-][j]] = ;
if(i + < n && mp[i+][j] == '#') cp[temp[i][j]][temp[i+][j]] = ;
if(j - >= && mp[i][j-] == '#') cp[temp[i][j]][temp[i][j-]] = ;
if(j + < n && mp[i][j+] == '#') cp[temp[i][j]][temp[i][j+]] = ;
} }
}
int res = hunyary();
printf("Case %d: %d\n",++cnt, res / );
}
return ;
}
匈牙利算法求最大匹配(HDU-4185 Oil Skimming)的更多相关文章
- HDU 4185 ——Oil Skimming——————【最大匹配、方格的奇偶性建图】
Oil Skimming Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- hdu 4185 Oil Skimming(二分图匹配 经典建图+匈牙利模板)
Problem Description Thanks to a certain "green" resources company, there is a new profitab ...
- 【01染色法判断二分匹配+匈牙利算法求最大匹配】HDU The Accomodation of Students
http://acm.hdu.edu.cn/showproblem.php?pid=2444 [DFS染色] #include<iostream> #include<cstdio&g ...
- HDU 4185 Oil Skimming 【最大匹配】
<题目链接> 题目大意: 给你一张图,图中有 '*' , '.' 两点,现在每次覆盖相邻的两个 '#' ,问最多能够覆盖几次. 解题分析: 无向图二分匹配的模板题,每个'#'点与周围四个方 ...
- HDU 4185 Oil Skimming
题目大意:在一个N*N的矩阵里寻找最多有多少个“##”(横着竖着都行). 题目分析:重新构图,直接以相邻的两个油井算中间算以条边,然后进行匹配,看看两两之间最多能匹配多少对. #include ...
- # 匈牙利算法(二分图最大匹配)- hdu 过山车
匈牙利算法(二分图最大匹配)- hdu 过山车 Hdu 2063 二分图:图中的点可以分成两组U,V,所有边都是连接U,V中的顶点.等价定义是:含奇数条边的图. 匹配:一个匹配是一个边的集合,其中任意 ...
- 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题
题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左 ...
- poj3020 Antenna Placement 匈牙利算法求最小覆盖=最大匹配数(自身对应自身情况下要对半) 小圈圈圈点
/** 题目:poj3020 Antenna Placement 链接:http://poj.org/problem?id=3020 题意: 给一个由'*'或者'o'组成的n*m大小的图,你可以用一个 ...
- 4185 Oil Skimming 最大匹配 奇偶建图
题目大意: 统计相邻(上下左右)的‘#’的对数. 解法: 与题目hdu1507 Uncle Tom's Inherited Land*类似,需要用奇偶建图.就是行+列为奇数的作为X集合,偶尔作为Y集合 ...
随机推荐
- GPS时间
GPS信息里面包含一个时间戳. phonegap(即cordova)的地理位置API Geolocation 提供了对设备GPS传感器的访问,返回的数据中,除了坐标,还有一个时间戳timestamp. ...
- 命令行下mysql的部分操作
远程链接数据库: mysql –u用户名 [–h主机名或者IP地址] –p密码 (用户名是登录的用 户,主机名或者IP地址为可选项,如果是本地连接则不需要,远程连接需要填写,密码是对应用户的密码.) ...
- 分类(category)是门学问
分类的精细程度表现了人类的文明程度. 1. 学科分类 cybernetics:控制论:
- bzoj4872
期望dp 首先如果k=n的话,那么我们从后往前,只要看到两者的灯就关上,因为如果当前一个灯没关上,那么之后不可能关上,一个灯只能由自己倍数控制,所以这样我们就计算出了需要操作的次数,如果这个次数< ...
- Sublime Text 汉化插件
https://blog.csdn.net/heyangyi_19940703/article/details/51869502 一.Sublime Text工具介绍: Sublime Text 是一 ...
- 客户端JavaScript Ajax
创建: 2017/10/21 完成: 2017/10/23 [TODO] 对Ajax收发各类型数据制作模板 补充跨域通信(cross origin) p457 HTTP通信 HTTP 超文本 ...
- Gold Coins
http://poj.org/problem?id=2000 #include<stdio.h> ; int main() { int coin[N]; ,j,k; j = ; k = ; ...
- SRAM and DRAM
DRAM:(Dynamic Random Access Memory)动态随机访问存储器,只能将数据保存较短的时间.每隔一段时间需要对数据进行刷新一次,没有刷新的单元数据会丢失.常见的用途是作为内存( ...
- selenium3 + python - autoit上传文件
一.环境准备: 1.可以autoit官网上下载,安装 http://www.autoitscript.com/site/ 2.AutoIt里面几个菜单功能介绍: SciTE Script Editor ...
- $P5269 欧稳欧再次学车$
\(problem\) 哇 看各位巨佬都来发\(T1\)的题解 我也来发一篇.(别的题目不会别瞎bb) 题目大意就是 \(T\) 秒 能走多少路程 第一行六个整数 \(T,N,L,R,X,K\) 接下 ...