Codevs1022题解---匈牙利算法

题目描述 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

这道题目中的一个矩阵会覆盖2块陆地,所以我们可以通过为陆地编号的方式将陆地分为两组,相邻的两块陆地间有一条边相连,即可进行二分图最大匹配的查找,注意需要排除水塘。

献上代码

 1 #include <cstdio>
 2 #include <cstring>
 3 bool wat[101][101],map[101][101],use[101][101];
 4 int n,m,k,ans,px,py;
 5 int from[101][101][2],t[5]={0,1,-1,0,0},tt[5]={0,0,0,1,-1};
 6 bool find(int x,int y)
 7 {
 8     for(int i=1;i<=4;i++)//向四周搜索可行的增广路
 9     {
10         px=x+t[i];py=y+tt[i];
11         if(px<=0||px>n||py<=0||py>m||wat[px][py])continue;
12         if (!wat[px][py] && !use[px][py]&& !map[px][py])//排除水塘
13         {
14             use[px][py]=true;
15             if((!from[px][py][0])||(find(from[px][py][0],from[px][py][1])))
16             {
17                 from[px][py][0]=x;
18                 from[px][py][1]=y;
19                 return true;
20             }
21         }
22     }
23     return false;
24 }
25 int main()
26 {
27     scanf("%d%d%d",&n,&m,&k);
28     int x,y;
29     for(int i=1;i<=k;i++)
30     {
31         scanf("%d%d",&x,&y);
32         wat[x][y]=true;
33     }
34     for(int i=1;i<=n;i++)
35         for(int j=1;j<=m;j++)
36             if((i % 2 && j % 2) || (i%2==0 && j%2==0))map[i][j]=1;//选出红色的1
37     for(int i=1;i<=n;i++)
38     {
39         for(int j=1;j<=m;j++)
40         {
41             if(!wat[i][j]&&map[i][j])
42             {
43                 memset(use, 0, sizeof(use));
44                 if(find(i,j))ans++;
45             }
46         }
47     }
48     printf("%d",ans);
49     return 0;
50 }
时间: 2024-10-29 19:12:10

Codevs1022题解---匈牙利算法的相关文章

网络流24题 第一题 - 洛谷2756 飞行员配对方案 二分图匹配 匈牙利算法

欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 题意概括 裸的二分图匹配 题解 匈牙利算法 上板子 代码 #include <cstring> #include <cstdio> #include <algorithm> #include <cstdlib> #include <cmath> using namespace std; const int N=100+5; int m,n,a,b,match[N

CODEVS1022 覆盖 (二分图染色+匈牙利算法)

先对整幅图进行二分图染色,再跑一遍匈牙利算法. 1 /* CODEVS1022 */ 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 7 #define maxn 10008 8 9 struct edge{ 10 int u,v,next; 11 }eg[maxn*4]; 12 13 int dx[4]={0,0,1,-1}; 14 i

【入门】匈牙利算法+HNOI2006 hero超级英雄题解

一.关于匈牙利算法 匈牙利算法是由匈牙利数学家Edmonds提出的,用增广路径求二分图最大匹配的算法. 听起来高端,其实说白了就是: 假设不存在单相思(单身狗偷偷抹眼泪),在一个同性恋不合法的国家里(不存在任何歧视#正色),有一些男人和女人,他们互相之间存在一些互相爱恋的关系.而匈牙利算法就是要促成尽量多的男女配对. 如下图: 绿色标注的就是这张图的一个最大二分图匹配. 先提一个下面会提到的名词:增广路:若P是图G中一条连通两个未匹配顶点的路径,并且属于M的边和不属于M的边(即已匹配和待匹配的边

匈牙利算法实战codevs1022覆盖

1022 覆盖 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 有一个N×M的单位方格中,其中有些方格是水塘,其他方格是陆地.如果要用1×2的矩阵区覆盖(覆盖过程不容许有任何部分重叠)这个陆地,那么最多可以覆盖多少陆地面积. 输入描述 Input Description 输入文件的第一行是两个整数N,M  (1<=N,M<=100),第二行为一个整数K( K<=50),接下来的K行,每行两个整数X

Bzoj 1562: [NOI2009]变换序列 匈牙利算法,二分图匹配

题目: http://cojs.tk/cogs/problem/problem.php?pid=409 409. [NOI2009]变换序列 ★★☆   输入文件:transform.in   输出文件:transform.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 对于N个整数0, 1, ……, N-1,一个变换序列T可以将i变成Ti,其中 定义x和y之间的距离.给定每个i和Ti之间的距离D(i,Ti), 你需要求出一个满足要求的变换序列T.如果有多个满足条

HDU--3081--Marriage Match II--最大匹配,匈牙利算法

Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1608    Accepted Submission(s): 566 Problem Description Presumably, you all have known the question of stable marriage match. A

关于匈牙利算法的两三事(新手向)

这是一篇简单的匈牙利算法的理解篇,首先匈牙利算法的名字听起来就和匈牙利牛肉饭一样让人产生食欲(?)233. 好的接下来我们开始正式带大家了解什么叫匈牙利算法. 那么要了解算法的基本原理,我们先看一张图 在这张图里,我们可以清楚的看出图上的点被我们分成了两种,一种是数字,另一种是字母,并且数字与数字.字母与字母之间是没有互相连接的边的,这种点被划为两种.且每种之间没有连边的图就叫做二分图,而我们的匈牙利算法就是用来处理二分图匹配的. 什么叫二分图匹配捏,很简单,我们从这张图中选出一些边,举个例子,

BZOJ 1191 [HNOI2006]超级英雄Hero:二分图匹配 匈牙利算法

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1191 题意: 有m道题,每答对一题才能接着回答下一个问题. 你一道题都不会,但是你有n个"锦囊妙计"(每个只能用一次). 对于每道题,你只能用该题规定的两种锦囊中的一种,来解决这道题. 问你最多能解决多少道题. 题解: 二分图最大匹配. 匈牙利算法. 问题与锦囊匹配. 最大匹配即为最多回答数. 但是题目中要求题目必须连续回答,不能中断. 所以在给每一个问题配对时,一旦匹配不上,

hdu 1083 匈牙利算法模板题

题意:有p个课程,n个学生,每个课程有x个学生喜欢.如果每个课程都至少可以分配一个学生就输出YES,否则输出NO. 题解:匈牙利算法裸题. 代码: #include <cstdio>#include <cstring>#define N 400int Map[N][N],S[N],vis[N],n;bool dfs(int u){    for(int i=1;i<=n;i++){        if(Map[u][i]&&!vis[i]){