zoukankan      html  css  js  c++  java
  • 【wikioi】1022 覆盖(匈牙利)

    http://www.wikioi.com/problem/1022/

    好不容易来一次1A,,水题啊。。

    染色后裸匈牙利orz

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define rep(i, n) for(int i=0; i<(n); ++i)
    #define for1(i,a,n) for(int i=(a);i<=(n);++i)
    #define for2(i,a,n) for(int i=(a);i<(n);++i)
    #define for3(i,a,n) for(int i=(a);i>=(n);--i)
    #define for4(i,a,n) for(int i=(a);i>(n);--i)
    #define CC(i,a) memset(i,a,sizeof(i))
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    #define read(a) a=getnum()
    #define print(a) printf("%d", a)
    inline int getnum() { int ret=0; char c; for(c=getchar(); c<'0' || c>'9'; c=getchar()); for(; c>='0' && c<='9'; c=getchar()) ret=ret*10+c-'0'; return ret; }
    
    const int N=10005;
    int n, m, a[105][105], imap[105][105], cnt;
    int ihead[N], inext[N*4], to[N*4];
    bool visy[N];
    int ly[N], x[N], cntx;
    inline void add(const int &u, const int &v) {
    	inext[++cnt]=ihead[u]; ihead[u]=cnt; to[cnt]=v;
    }
    
    bool ifind(const int &u) {
    	int v;
    	for(int i=ihead[u]; i; i=inext[i]) if(!visy[v=to[i]]) {
    		visy[v]=true;
    		if(!ly[v] || ifind(ly[v])) {
    			ly[v]=u;
    			return true;
    		}
    	}
    	return false;
    }
    
    int main() {
    	read(n); read(m);
    	int k=getnum();
    	for1(i, 1, k) a[getnum()][getnum()]=1;
    	int last;
    	int u;
    	for1(i, 1, n) {
    		last=i;
    		for1(j, 1, m) {
    			if(!a[i][j] && (last%2))  {
    				u=(i-1)*m+j;
    				if(i>1 && !a[i-1][j]) add(u, u-m);
    				if(i<n && !a[i+1][j]) add(u, u+m);
    				if(j>1 && !a[i][j-1]) add(u, u-1);
    				if(j<m && !a[i][j+1]) add(u, u+1);
    				x[++cntx]=u;
    			}
    			++last;
    		}
    	}
    	int ans=0;
    	for1(i, 1, cntx) {
    		CC(visy, 0);
    		if(ifind(x[i])) ++ans;
    	}
    	print(ans);
    	return 0;
    }
    

    题目描述 Description

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

     

    输入描述 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

    见描述

     

  • 相关阅读:
    MVC初体验-过滤器(10)
    MVC阶段复习(一)
    搭建自己的视频文件网站
    答辩系统bug修改记录
    linux的pvtrace环境配置
    Linux使用期间命令积累
    php项目第三季
    分布式作业
    php第二季
    php错误记录
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/3893522.html
Copyright © 2011-2022 走看看