记录编号 271452 评测结果 AAAAAAAAAA
题目名称 [ZOJ 1654]放置机器人 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2016-06-16 06:41:40 内存使用 0.39 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=60;
struct edge{
	int to;
	edge *prev;
}ee[maxn*maxn];
void insert(int,int);
bool path(int);
int maxmatch();
char getfchar();
int len=0;
edge *last[maxn*maxn]={NULL};
int na,nb,ca[maxn*maxn],cb[maxn*maxn];
bool vis[maxn*maxn];
int id[maxn][maxn][2]={{{0}}};
int n,m,k;
char a[maxn][maxn];
int main(){
#define MINE
#ifdef MINE
	freopen("placetherobots.in","r",stdin);
	freopen("placetherobots.out","w",stdout);
#endif
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)a[i][j]=getfchar();
	k=0;
	for(int i=1;i<=n;i++){
		k++;
		for(int j=1;j<=m;j++){
			if(a[i][j]=='#'){
				while(j<=m&&a[i][j]=='#')j++;
				if(j<=m)k++;
			}
			id[i][j][0]=k;
		}
	}
	na=k;
	k=0;
	for(int j=1;j<=m;j++){
		k++;
		for(int i=1;i<=n;i++){
			if(a[i][j]=='#'){
				while(i<=n&&a[i][j]=='#')i++;
				if(i<=n)k++;
			}
			id[i][j][1]=k;
		}
	}
	nb=k;
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(a[i][j]=='o')
		insert(id[i][j][0],id[i][j][1]);
	printf("%d",maxmatch());
	return 0;
}
void insert(int x,int y){
	ee[len].to=y;
	ee[len].prev=last[x];
	last[x]=&ee[len++];
}
bool path(int x){
	for(edge *e=last[x];e;e=e->prev){
		int y=e->to;
		if(!vis[y]){
			vis[y]=true;
			if(!cb[y]||path(cb[y])){
				ca[x]=y;
				cb[y]=x;
				return true;
			}
		}
	}
	return false;
}
int maxmatch(){
	int result=0;
	for(int i=1;i<=na;i++)if(!ca[i]){
		memset(vis,0,sizeof(vis));
		result+=path(i);
	}
	return result;
}
inline char getfchar(){
	char c=getchar();
	while(c!='#'&&c!='*'&&c!='o')c=getchar();
	return c;
}