关于匈牙利算法的描述可以去看 http://blog.csdn.net/winoros/article/details/18949489

下面贴出题目的description

Muddy Fields
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 7533   Accepted: 2778

Description

Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= R <= 50, 1 <= C <= 50). While good for the grass, the rain makes some patches of bare earth quite muddy. The cows, being meticulous grazers, don't want to get their hooves dirty while they eat.

To prevent those muddy hooves, Farmer John will place a number of wooden boards over the muddy parts of the cows' field. Each of the boards is 1 unit wide, and can be any length long. Each board must be aligned parallel to one of the sides of the field.

Farmer John wishes to minimize the number of boards needed to cover the muddy spots, some of which might require more than one board to cover. The boards may not cover any grass and deprive the cows of grazing area but they can overlap each other.

Compute the minimum number of boards FJ requires to cover all the mud in the field.

大意就是在一个n * m的图中,有一些地方是要加上遮挡物的,遮挡物可以横着放,可以竖着放,长度不限。要求找到遮挡物放置的最小数目。

这里用到了一种构建二分图的方法,就是以原图中的边为二分图中的点,横边在一个集合中,纵边在一个集合中,而原图中的点则作为二分图中的边,用于连接两个集合中的点(原来的边)。

对该题使用上述构图法的话,那么则是那些需要遮挡物的横边和纵边为两个集合中的点。

对于题目中给出的样例(*代表方块需要被遮挡)来说就是

      和    

分别作为两个集合中的点(我的代码中边是从0开始标号的), 而横边和纵边相交的点就是所建二分图中的边。

那么所求便是二分图的最小顶点覆盖,可以转化为用匈牙利算法求最大匹配。

具体对边标号的方法可以看我的代码。

(对了这个题有个蛋疼的地方,就是二分图最多会有多少个点。。。我个人认为是625,就是25*25.。。。不过代码是建了500大小的数组过去的。。。)

(再P.S. 在题目的discuss里有说数组要开900多。。。我是没有理解。。。)

// by winoros 184K 16MS C++#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <cstring>
#include <numeric>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <utility>
#define max(a,b) ((a)>(b))?(a):(b)
#define min(a,b) ((a)>(b))?(b):(a)
#define rep(i,initial_n,end_n) for(int (i)=(initial_n);(i)<(end_n);i++)
#define repp(i,initial_n,end_n) for(int (i)=(initial_n);(i)<=(end_n);(i)++)
#define reep(i,initial_n,end_n) for((i)=(initial_n);(i)<(end_n);i++)
#define reepp(i,initial_n,end_n) for((i)=(initial_n);(i)<=(end_n);(i)++)
#define eps 1.0E-9
#define MAX_N 1010
#define INF 1<<30using namespace std;typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned long long ull;vector<int> v[500];
int pre[500];
bool flag[500];
int atlas[55][55];bool find(int x);
int hungary(int n);int main() {int n, m, cur = 0;char tmp;scanf("%d%d", &n, &m);getchar();//读入数据,并对横边标号rep(i, 0, n) {rep(j, 0, m) {scanf("%c", &tmp);if(tmp == '.') atlas[i][j] = -1;else if(j == 0 || atlas[i][j - 1] == -1) atlas[i][j] = cur++;else  atlas[i][j] = atlas[i][j - 1];}getchar();}//对纵边标号,并建二分图int curr = -1;rep(j, 0, m) {rep(i, 0, n) {if(atlas[i][j] == -1) continue;else if(i == 0 || atlas[i - 1][j] == -1) v[atlas[i][j]].push_back(++curr);else v[atlas[i][j]].push_back(curr);}}printf("%d\n", hungary(cur));return 0;
}bool find(int x) {int len = v[x].size();rep(i, 0, len) {if(!flag[v[x][i]]) {flag[v[x][i]] = true;if(pre[v[x][i]] == -1 || find(pre[v[x][i]])) {pre[v[x][i]] = x;return true;}}}return false;
}int hungary(int n) {int ans = 0;memset(pre, 255, sizeof(pre));rep(i, 0, n) {memset(flag, 0, sizeof(flag));if(find(i)) ans++;}return ans;
}

poj 2226 匈牙利匹配 一种构图方法相关推荐

  1. 游戏二次元场景插画教程,常见的6种构图方法分享

    今天小编分享一个原画人二次元场景插画教程,这个教程是由原画人JW老师主讲的.主要分享常见的6种构图方法. 简单介绍一下 原画人JW老师,从业3年,现在是自由插画师兼独立游戏制作担任游戏主美.擅长意境的 ...

  2. GCN】在NLP中应用GCN的几种构图方法整理

    GCN]在NLP中应用GCN的几种构图方法整理:https://blog.csdn.net/qq_27590277/article/details/106264292

  3. 【GCN】在NLP中应用GCN的几种构图方法整理

    作者:Carrie GCN 的兴起为许多NLP问题的解决提供了新的思路.通过句法依赖树构建图结构,基于此通过GCN进行NLP问题的解决已经得到了广泛应用.那么除此之外,还有哪些方法可以用于在文本中建立 ...

  4. 在NLP中应用GCN的几种构图方法整理

    GCN 的的兴起为许多NLP问题的解决提供了新的思路.通过句法依赖树构建图结构,基于此通过GCN进行NLP问题的解决已经得到了广泛应用.那么除此之外,还有哪些方法可以用于在文本中建立图结构从而使用GC ...

  5. java 贪心算法思路,贪心算法之——黑白点的匹配(两种实现方法),贪心算法...

    贪心算法之--黑白点的匹配(两种实现方法),贪心算法 一.题目 设平面上分布着n个白点和n个黑点,每个点用一对坐标(x, y)表示.一个黑点b=(xb,yb)支配一个白点w=(xw, yw)当且仅当x ...

  6. Matplotlib基本原理以及若干种绘图方法

    Matplotlib学习笔记 一.Matplotlib基础原理 1.Matplotlib图片结构 matpilotlib构图主要分为三个部分,figure(画布).axes(坐标系).axis(坐标) ...

  7. 系统相机裁剪比例_从单反到手机,三种黄金比例构图方法,让你的照片与众不同...

    古埃及金字塔和达芬奇蒙娜丽莎有什么共同之处?它们都是使用黄金比例进行设计的.不管是建筑设计还是绘画,它们都是属于艺术的一种,所以黄金比例也同样适用于摄影构图中.很多优秀的摄影作品都会使用黄金比例的构图 ...

  8. 三菱V3菱悦智能遥控匹配详细的(两种)方法 配钥匙

    三菱V3菱悦智能遥控匹配详细的(两种)方法 蜂鸣器, V3菱悦, 主机, 遥控器, 报警喇叭 方法遥控器学习 当遥控器损或丢失时可通过重新学习操作将原遥控器信息从主机记忆中删除然后重新学习遥控器 1先 ...

  9. 代码的两种命名方法:驼峰命名、匈牙利命名(优缺点)

    代码的两种命名方法:驼峰命名.匈牙利命名(优缺点) 一.骆驼命名法: 小驼峰法(camel方法)变量一般用小驼峰法标识. 第一个单词以小写字母开始:第二个单词的首字母大写或每一个单词的首字母都采用大写 ...

最新文章

  1. tornado+nginx上传视频文件
  2. 最好机器学习NLP和python教程
  3. C语言13567星号如何输出,c语言程序编程心得
  4. idea 添加 VUE 的语法
  5. OpenGL 3D 选择
  6. snapshot---caffemodel和solverstate
  7. 软件设计:表达组织中的上下级关系
  8. Python学习入门5:Python到底应该怎么学?
  9. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_25-页面查询接口测试-Swagger...
  10. C# 获取二维数组的元素个数;获取行数,列数
  11. 网易2019:矩形重叠
  12. 点是否在三角形内——C++实现
  13. drcom运行在路由器上
  14. 前馈神经网络(FNN)
  15. Golang环境变量设置(二)--GOMODULEGOPROXY
  16. Nodejs日志库winston配置
  17. layui表格使用及分页实现
  18. Typora使用方法简单总结
  19. c#操作excel 使用excel自带类库Microsoft.Office.Interop.Excel
  20. Vue生命周期,Vue中在哪个生命周期阶段调用异步请求最佳

热门文章

  1. 详解OutputStreamWriter与InputStreamReader
  2. linux一键搭建ddns,在CentOS下配置DDNS并实现动态更新
  3. 2018年世界杯德国输给韩国?终于找到原因了
  4. 市面上几款第一人称射击游戏的武器后坐力效果观察
  5. STL(标准模板库)--容器(一)
  6. 从卡尔·海因里希·马克思到詹姆斯•高斯林
  7. 桌面动画 - 雪花和兔子
  8. CAN(FD)数据记录诊断仪-CANLog-VCI
  9. 微信隐藏功能系列4:微信铃声怎么设置?告别枯燥,3步做到
  10. Java实现图片(jpg/png)转成TIF格式(300dpi)踩坑笔记