匈牙利算法求最大匹配(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集合 ...
随机推荐
- C# 生成pdf文件客户端下载
itextsharp.dll 下载:http://sourceforge.net/projects/itextsharp/ 程序需引用:itextsharp.dll,itextsharp.pdfa.d ...
- Oracle Temp 表空间切换
一.TEMP表空间作用 暂时表空间主要用途是在数据库进行排序运算.管理索引.訪问视图等操作时提供暂时的运算空间,当运算完毕之后系统会自己主动清理.当 oracle 里须要用到 sort 的时候. PG ...
- 【ubuntu firefox】 Firefox is already running, but is not responding
在ubuntu下启动firefox报错 Firefox is already running, but is not responding. To open a new window, you mus ...
- swift手记-6
// // ViewController.swift // learn // // Created by myhaspl on 16/1/26. // Copyright (c) 2016年 myha ...
- Apache Kafka-0.8.1.1源代码编译
作者:过往记忆 | 新浪微博:左手牵右手TEL | 能够转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明博客地址:http://www.iteblog.com/文章标题:<Apac ...
- CoffeeScript里的or
CoffeeScript里的or,其实会被编译为 || 这并没有什么令人惊奇之处.我惊讶的是类似这样一个表达式: word = null hi = word or "Hello World! ...
- EF TMD
TMD 几个月前,本着学习的心态,首次在项目中应用EF.因为这里老是赶.赶.赶,当时只是匆匆而就,浅尝辄止,搞到现在对EF一知半解,每次在新项目使用,都担惊受怕,大费周折,不知道什么时候,在什么地方就 ...
- BestCoder Round #60.1003.GT and set/HDU5506 dfs
GT and set Accepts: 35 Submissions: 194 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 655 ...
- P3225 [HNOI2012]矿场搭建 tarjan割点
这个题需要发现一点规律,就是先按割点求块,然后求每个联通块中有几个割点,假如没有割点,则需要建两个出口,如果一个割点,则需要建一个出口,2个以上不用建. 题干: 题目描述 煤矿工地可以看成是由隧道连接 ...
- linux下的so、o、lo、a、la文件的区别
o: 编译的目标文件a: 静态库,其实就是把若干o文件打了个包so: 动态链接库(共享库) lo: 使用libtool编译出的目标文件,其实就是在o文件中添加了一些信息la: 使用libtool编译出 ...