博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
匈牙利算法实战codevs1022覆盖
阅读量:5146 次
发布时间:2019-06-13

本文共 1670 字,大约阅读时间需要 5 分钟。

 1022 覆盖

 
 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 大师 Master
 查看运行结果
 
 
题目描述 
Description

有一个N×M的单位方格中,其中有些方格是水塘,其他方格是陆地。如果要用1×2的矩阵区覆盖(覆盖过程不容许有任何部分重叠)这个陆地,那么最多可以覆盖多少陆地面积。

 

输入描述 
Input Description

输入文件的第一行是两个整数NM  (1<=NM<=100),第二行为一个整数K( K<=50),接下来的K行,每行两个整数X,Y表示K个水塘的行列位置。(1<=X<=N1<=Y<=M)。

 

输出描述 
Output Description

输出所覆盖的最大面积块(1×2面积算一块)。

样例输入 
Sample Input

4 4

6

1 1

1 4

2 2

4 1

4 2

4 4

样例输出 
Sample Output

4

解题思路   将该题目转化为二分图使用匈牙利算法解
n*m的格子可以按顺序分成0 1的图
如 
0101010101
1010101010
0101010101
1010101010
一个点的位置(x,y)可以和周围的点(x+1,y),(x,y-1),(x,y+1),(x-1,y)进行两两匹配
有水的地方直接跳过
得出最后最多有多少对匹配成功的点
即答案所求 多少可以覆盖多少板子

#include
#include
using namespace std;int n,m,k,a,b,ans;bool water[101][101];bool ok[101][101];int linkx[101][101];int linky[101][101];int dx[]={
0,0,1,-1};int dy[]={
1,-1,0,0};bool dfs(int x,int y){ if(water[x][y])return false; for(int i=0;i<4;i++) { int xx=x+dx[i]; int yy=y+dy[i]; if(xx>0&&yy>0&&yy<=m&&xx<=n&&water[xx][yy]==false&&ok[xx][yy]==false) { ok[xx][yy]=true; if(linkx[xx][yy]==0||dfs(linkx[xx][yy],linky[xx][yy])) { linkx[xx][yy]=x; linky[xx][yy]=y; return true; } } } return false;}int main(){ cin>>n>>m>>k; for(int i=0;i
>a>>b; water[a][b]=true; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { memset(ok,0,sizeof(ok)); if(i%2==j%2) if(dfs(i,j)) ans++; } cout<
<

 

转载于:https://www.cnblogs.com/DWVictor/p/10283046.html

你可能感兴趣的文章
Weka中数据挖掘与机器学习系列之基本概念(三)
查看>>
leetcode-Sort List
查看>>
中文词频统计
查看>>
【Linux】ping命令详解
查看>>
Oracle中包的创建
查看>>
关于PHP会话:session和cookie
查看>>
jQuery on(),live(),trigger()
查看>>
treegrid.bootstrap使用说明
查看>>
[Docker]Docker拉取,上传镜像到Harbor仓库
查看>>
导航,头部,CSS基础
查看>>
[USACO 2017 Feb Gold] Tutorial
查看>>
gzip
查看>>
转负二进制(个人模版)
查看>>
LintCode-Backpack
查看>>
查询数据库锁
查看>>
我对于脚本程序的理解——百度轻应用有感
查看>>
面试时被问到的问题
查看>>
注解小结
查看>>
list control控件的一些操作
查看>>
绝望的第四周作业
查看>>