code vs 1022 覆盖 (匈牙利算法)

1022 覆盖

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

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

 

code vs 1022 覆盖 (匈牙利算法)_第1张图片
输入描述 Input Description

输入文件的第一行是两个整数N,M  (1<=N,M<=100),第二行为一个整数K( K<=50),接下来的K行,每行两个整数X,Y表示K个水塘的行列位置。(1<=X<=N,1<=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

数据范围及提示 Data Size & Hint
见描述

分类标签 Tags 点此展开 



#include
#include
#include
#include
#include
#define N 203
using namespace std;
int map[N][N],n,m;
int belongx[N][N],belongy[N][N],cur[N][N];
int px[10]={0,1,0,-1},py[10]={1,0,-1,0};
bool find(int x,int y,int k)
{
	for (int i=0;i<4;i++)
	{
		int nowx=x+px[i]; int nowy=y+py[i];
		if (map[nowx][nowy]||nowx==0||nowx==n+1||nowy==0||nowy==m+1) continue;
		if (cur[nowx][nowy]==k) continue;
		cur[nowx][nowy]=k;
		if (!belongx[nowx][nowy]&&!belongy[nowx][nowy]||find(belongx[nowx][nowy],belongy[nowx][nowy],k)){
			belongx[nowx][nowy]=x; 
			belongy[nowx][nowy]=y;
			return true;
		}
	}
	return false;
}
int main()
{
	freopen("a.in","r",stdin);
	scanf("%d%d",&n,&m);
	int t;scanf("%d",&t);
	for (int i=1;i<=t;i++){
		int x,y;scanf("%d%d",&x,&y);
		map[x][y]=1;
	}
	int cnt=0; int ans=0;
	for (int i=1;i<=n;i++)
	 for (int j=1;j<=m;j++)
	  if (!map[i][j])
	    if (find(i,j,++cnt)) ans++;
	printf("%d\n",ans/2);
}





你可能感兴趣的:(图论)