【wikioi】1022カバー(ハンガリー)
3056 ワード
http://www.wikioi.com/problem/1022/
せっかく1 Aに来たんだから、、水問題かな.
染色後裸ハンガリーorz
テーマ説明Description
Nがある×Mの単位格子のうち、一部の格子は池であり、他の格子は陸地である.1を使うなら×2のマトリックス領域は、この陸地を覆う(被覆過程においていかなる部分も重なることは許されない)ので、最大でどれだけの陸地面積を覆うことができるか.
入力記述Input Description
入力ファイルの最初の行は2つの整数N,Mである (1<=N,M<=100),第2の挙動は1つの整数K(K<=50)であり,次のK行は1行あたり2つの整数X,YはK個の池の行列位置を表す.(1<=X<=N,1<=Y<=M).
出力記述Output Description
オーバーライドされた最大面積ブロックを出力(1)×2面積を1枚とする).
サンプル入力Sample Input
4 4
6
1 1
1 4
2 2
4 1
4 2
4 4
サンプル出力Sample Output
4
データ範囲とヒントData Size&Hint
説明を参照
せっかく1 Aに来たんだから、、水問題かな.
染色後裸ハンガリー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
入力ファイルの最初の行は2つの整数N,Mである (1<=N,M<=100),第2の挙動は1つの整数K(K<=50)であり,次のK行は1行あたり2つの整数X,YはK個の池の行列位置を表す.(1<=X<=N,1<=Y<=M).
出力記述Output Description
オーバーライドされた最大面積ブロックを出力(1)×2面積を1枚とする).
サンプル入力Sample Input
4 4
6
1 1
1 4
2 2
4 1
4 2
4 4
サンプル出力Sample Output
4
データ範囲とヒントData Size&Hint
説明を参照