记录编号 |
173064 |
评测结果 |
AAAAAAAAAAAAAAAAA |
题目名称 |
[USACO JAN05]泥泞的牧场 |
最终得分 |
100 |
用户昵称 |
forever |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.022 s |
提交时间 |
2015-07-27 20:52:46 |
内存使用 |
138.68 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
char a[52][52];
int b[52][52],num,jk,numo[3600];
int n,m,numk[3600],tot,head[3600];
int match[3600],ans;
bool v[3600];
struct dd
{
int c[3000];
int d[3000];
int shu;
}jie[3020],jiege[3020];
struct df
{
int zhong;
int next;
}ad[3200];
void add(int x,int y)
{
tot++;
ad[tot].zhong=y;
ad[tot].next=head[x];
head[x]=tot;
}
void init()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
{
cin>>a[i][j];
if(a[i][j]=='.')
{
b[i][j]=1;
continue;
}
if(a[i][j]=='*')
{
b[i][j]=2;
continue;
}
}
}
void heng()
{ num=0;
for(int i=1;i<=m;++i)
{ int yu=i,kl=1;
while(1==1)
{ if(b[yu][kl]!=1)
num++;
while(b[yu][kl]!=1&&kl<=n)
{
numk[num]++;
jie[num].c[numk[num]]=yu;
jie[num].d[numk[num]]=kl;
jie[num].shu++;
kl++;
}
kl++;
if(kl>n)
{
break;
}
}
}
jk=num;
}
void zong()
{
for(int i=1;i<=n;++i)
{
int yu=1,kl=i;
while(1==1)
{ if(b[yu][kl]!=1)
num++;
while(b[yu][kl]!=1&&yu<=m)
{
numo[num]++;
jiege[num].shu++;
jiege[num].c[numo[num]]=yu;
jiege[num].d[numo[num]]=kl;
yu++;
}
yu++;
if(yu>m)
{
break;
}
}
}
//cout<<num<<endl;
}
void jianfen()
{
for(int i=1;i<=jk;++i)
{
for(int j=1;j<=jie[i].shu;++j)
{
for(int k=jk+1;k<=num;++k)
{
for(int h=1;h<=jiege[k].shu;++h)
{
if(jie[i].c[j]==jiege[k].c[h]&&jie[i].d[j]==jiege[k].d[h]&&b[jie[i].c[j]][jie[i].d[j]]==2)
{
add(i,k);
//add(k,i);
}
}
}
}
}
}
bool fen(int u)
{
for(int i=head[u];i!=-1;i=ad[i].next)
{
int yu=ad[i].zhong;
if(!v[yu])
{ v[yu]=1;
if(!match[yu]||fen(match[yu]))
{
match[yu]=u;
return true;
}
}
}
return false;
}
void work()
{
heng();
zong();
jianfen();
}
int main()
{ freopen("usaco_cover.in","r",stdin);
freopen("usaco_cover.out","w",stdout);
memset(head,-1,sizeof(head));
init();
work();
for(int i=1;i<=num;++i)
{
memset(v,0,sizeof(v));
if(fen(i))
ans++;
}
printf("%d",ans);
//while(1);
}