匈牙利算法求最大匹配(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集合 ...
随机推荐
- com.opensymphony.xwork2.inject.DependencyException: com.opensymphony.xwork2.inject.ContainerImpl$Mis
为什么会出现这个错误? 我使用了Maven配置Struts,所以改动Struts配置文件的默认路径,例如以下: <!-- 配置struts --> <filter> <f ...
- mp3播放时间
import os os_sep = os.sep this_file_abspath = os.path.abspath(__file__) this_file_dirname, this_file ...
- 一段shell脚本
//根据入参增加nginx反向代理#!/bin/bash#set -x log_path="./proc/logs/shellExecute.log"log_path_back=& ...
- Linux ALSA声卡驱动之四:Control设备的创建
声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢! Control接口 Control接口主要让用户空间的应用程序(alsa-lib)可以访问 ...
- 华为FusionSphere概述——计算资源、存储资源、网络资源的虚拟化,同时对这些虚拟资源进行集中调度和管理
华为FusionSphere概述 FusionSphere是华为自主知识产权的云操作系统,集虚拟化平台和云管理特性于一身,让云计算平台建设和使用更加简捷,专门满足企业和运营商客户云计算的需求.华为云操 ...
- 2-sat总结
算法 构造一个有向图G,每个变量xi拆成两个点2i和2i+1 分别表示xi为假,xi为真 那么对于“xi为真或xj为假”这样的条件 我们就需要连接两条边 2*i —>2*j(表示如果i为假,那么 ...
- MySQL社区版是世界上最流行的开源数据库的免费
昨天晚上搞了很久,终于搞清楚mysql的安装配置了,我真是太low了.当我在云服务器上登进Mysql时,真是高兴哈哈,咱一步一步来,彻底搞懂Mysql的安装配置. 我的安装环境: 阿里云服务器 1 2 ...
- openStack Packages yum upgrade
依赖关系解决 ============================================================================================= ...
- Oracle查询列重命名
select count(*) 呼入量 from crm_cisco_call_detail
- 数据库异常 :java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
最近在新项目中突然出现了 java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) ...