如下图:要求最多可以凑成多少对对象

大佬博客:

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值就是最大的匹配值。

附练习题:HDU-4185 Oil Skimming

水平和竖直的两个‘#’,可以连成一条边,求这样的边最多有多少条。

主要是自己如何去建图:

  1. 遍历数组mp对‘#’进行标号;
  2. 再次遍历遇到‘#’,看他上下左右是否有‘#’,有的话在cp数组中进行连线;
  3. 再利用匈牙利算法求最大匹配。

代码:

#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)的更多相关文章

  1. HDU 4185 ——Oil Skimming——————【最大匹配、方格的奇偶性建图】

    Oil Skimming Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  2. hdu 4185 Oil Skimming(二分图匹配 经典建图+匈牙利模板)

    Problem Description Thanks to a certain "green" resources company, there is a new profitab ...

  3. 【01染色法判断二分匹配+匈牙利算法求最大匹配】HDU The Accomodation of Students

    http://acm.hdu.edu.cn/showproblem.php?pid=2444 [DFS染色] #include<iostream> #include<cstdio&g ...

  4. HDU 4185 Oil Skimming 【最大匹配】

    <题目链接> 题目大意: 给你一张图,图中有 '*' , '.' 两点,现在每次覆盖相邻的两个 '#' ,问最多能够覆盖几次. 解题分析: 无向图二分匹配的模板题,每个'#'点与周围四个方 ...

  5. HDU 4185 Oil Skimming

    题目大意:在一个N*N的矩阵里寻找最多有多少个“##”(横着竖着都行).     题目分析:重新构图,直接以相邻的两个油井算中间算以条边,然后进行匹配,看看两两之间最多能匹配多少对. #include ...

  6. # 匈牙利算法(二分图最大匹配)- hdu 过山车

    匈牙利算法(二分图最大匹配)- hdu 过山车 Hdu 2063 二分图:图中的点可以分成两组U,V,所有边都是连接U,V中的顶点.等价定义是:含奇数条边的图. 匹配:一个匹配是一个边的集合,其中任意 ...

  7. 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题

    题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左 ...

  8. poj3020 Antenna Placement 匈牙利算法求最小覆盖=最大匹配数(自身对应自身情况下要对半) 小圈圈圈点

    /** 题目:poj3020 Antenna Placement 链接:http://poj.org/problem?id=3020 题意: 给一个由'*'或者'o'组成的n*m大小的图,你可以用一个 ...

  9. 4185 Oil Skimming 最大匹配 奇偶建图

    题目大意: 统计相邻(上下左右)的‘#’的对数. 解法: 与题目hdu1507 Uncle Tom's Inherited Land*类似,需要用奇偶建图.就是行+列为奇数的作为X集合,偶尔作为Y集合 ...

随机推荐

  1. com.opensymphony.xwork2.inject.DependencyException: com.opensymphony.xwork2.inject.ContainerImpl$Mis

    为什么会出现这个错误? 我使用了Maven配置Struts,所以改动Struts配置文件的默认路径,例如以下: <!-- 配置struts --> <filter> <f ...

  2. mp3播放时间

    import os os_sep = os.sep this_file_abspath = os.path.abspath(__file__) this_file_dirname, this_file ...

  3. 一段shell脚本

    //根据入参增加nginx反向代理#!/bin/bash#set -x log_path="./proc/logs/shellExecute.log"log_path_back=& ...

  4. Linux ALSA声卡驱动之四:Control设备的创建

    声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢! Control接口 Control接口主要让用户空间的应用程序(alsa-lib)可以访问 ...

  5. 华为FusionSphere概述——计算资源、存储资源、网络资源的虚拟化,同时对这些虚拟资源进行集中调度和管理

    华为FusionSphere概述 FusionSphere是华为自主知识产权的云操作系统,集虚拟化平台和云管理特性于一身,让云计算平台建设和使用更加简捷,专门满足企业和运营商客户云计算的需求.华为云操 ...

  6. 2-sat总结

    算法 构造一个有向图G,每个变量xi拆成两个点2i和2i+1 分别表示xi为假,xi为真 那么对于“xi为真或xj为假”这样的条件 我们就需要连接两条边 2*i —>2*j(表示如果i为假,那么 ...

  7. MySQL社区版是世界上最流行的开源数据库的免费

    昨天晚上搞了很久,终于搞清楚mysql的安装配置了,我真是太low了.当我在云服务器上登进Mysql时,真是高兴哈哈,咱一步一步来,彻底搞懂Mysql的安装配置. 我的安装环境: 阿里云服务器 1 2 ...

  8. openStack Packages yum upgrade

    依赖关系解决 ============================================================================================= ...

  9. Oracle查询列重命名

    select count(*) 呼入量 from crm_cisco_call_detail

  10. 数据库异常 :java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

    最近在新项目中突然出现了  java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) ...