您的位置:首页 > 其它

zoj1002——Fire Net

2010-09-18 17:59 309 查看
最大顶点覆盖数!

#include<stdio.h>
#include<string.h>
#define max 20
char g[max][max];
int gra[max*max][max*max],cx[max*max][max*max];
int cy[max*max][max*max],vis[max*max],my[max*max];
int n,nx,ny;
bool find(int v)
{
int i;
for(i=1;i<=ny;i++)
{
if(gra[v][i]&&vis[i]==0)
{
vis[i]=1;
if(my[i]==0||find(my[i]))
{
my[i]=v;
return true;
}
}
}
return false;
}
void solve()
{
int i,j;
int ans=0;
memset(my,0,sizeof(my));
for(i=1;i<=nx;i++)
{
memset(vis,0,sizeof(vis));
if(find(i))
ans++;
}
printf("%d/n",ans);
}
int main()
{
int i,j;
while(scanf("%d",&n)&&n)
{
getchar();
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
scanf("%c",&g[i][j]);
getchar();
}
nx=0;ny=0;
for(i=1;i<=n;i++)
{
j=1;
while(j<=n)
{
if(g[i][j]=='.')
{
nx++;
while(j<=n&&g[i][j]=='.')
{
cx[i][j]=nx;
j++;
}
}
else j++;
}
}
for(j=1;j<=n;j++)
{
i=1;
while(i<=n)
{
if(g[i][j]=='.')
{
ny++;
while(i<=n&&g[i][j]=='.')
{
cy[i][j]=ny;
i++;
}
}
else i++;
}
}
memset(gra,0,sizeof(gra));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(g[i][j]=='.')
gra[cx[i][j]][cy[i][j]]=1;
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: