您的位置:首页 > 其它

POJ2226最大匹配经典构图

2011-08-20 17:37 435 查看
实质上要认识到,每一个连续的行或者列。都可以当成一个点。

如果两个点有交线,则说明对于该'*'点,既可以用横的木板盖住。

很不错的题目。

#include<iostream>

using namespace std;

#define CLR(dir,v) memset(dir,v,sizeof(dir))

const int N=55;

const int inf=999;

int n,m;

char mat

;

int maze

;

int a

;

int b

;

int table[inf][inf];

int link[inf];

bool visit[inf];

int nr,nc;

int ny,nx;

bool dfs(int u)

{

for(int i=1;i<=ny;i++)

{

if(table[u][i]==1&&!visit[i])

{

visit[i]=true;

if(link[i]==-1||dfs(link[i]))

{

link[i]=u;

return true;

}

}

}

return false;

}

int main()

{

scanf("%d%d",&n,&m);

CLR(table,0);

CLR(link,-1);

for(int i=1;i<=n;i++)

{

scanf("%s",mat[i]+1);

}

for(int i=1;i<=n;i++)

for(int j=1;j<=m;j++)

{

if(mat[i][j]=='*')

{

if(mat[i][j-1]=='*')

{

a[i][j]=a[i][j-1];

}

else

{

a[i][j]=++nx;

}

}

}

for(int j=1;j<=m;j++)

for(int i=1;i<=n;i++)

{

if(mat[i][j]=='*')

{

if(mat[i-1][j]=='*')

{

b[i][j]=b[i-1][j];

}

else

{

b[i][j]=++ny;

}

table[a[i][j]][b[i][j]]=1;

}

}

int ans=0;

for(int i=1;i<=nx;i++)

{

CLR(visit,false);

if(dfs(i))

ans++;

}

printf("%d\n",ans);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: