您的位置:首页 > 其它

POJ 1469,1274,2239,2536,2584,2446二分图的匈牙利算法(裸)

2012-08-05 19:47 441 查看
POJ1469

习惯性的不写return 0;这次尝到苦头了,很幸福的WA了……找了好久才知道是这个坏毛病……

View Code

#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int M=2010;
int nx,ny;
int cx[M],cy[M];
bool _map[M][M],vis[M];
bool hp[100][100];
int findpath(int u)
{
int i,j;
for(i=0;i<ny;i++)
{
if(_map[u][i]&&!vis[i])
{
vis[i]=1;
if(cy[i]==-1||findpath(cy[i]))
{
cy[i]=u;
cx[u]=i;
return 1;
}
}
}
return 0;
}
int MaxMatch()
{
int res=0;
int i,j;
for(i=0;i<nx;i++)
cx[i]=-1;
for(j=0;j<ny;j++)
cy[j]=-1;
for(i=0;i<nx;i++)
{
if(cx[i]==-1)
{
for(j=0;j<ny;j++)
vis[j]=0;
res+=findpath(i);
}
}
return res;
}
int m,n,k;
int move[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int check(int x,int y)
{
if(x>=0&&x<m&&y>=0&&y<n&&!hp[x][y]) return 1;
return 0;
}
int main()
{
int x,y;
while(scanf("%d%d%d",&m,&n,&k)!=EOF)
{
memset(hp,0,sizeof(hp));
memset(_map,0,sizeof(_map));
for(int i=0;i<k;i++)
{
scanf("%d%d",&x,&y);
hp[y-1][x-1]=1;
}
if((m*n-k)&1){printf("NO\n");continue;}
nx=ny=m*n;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
//printf("%d %d:\n",i,j);
if((i+j)&1)
if(!hp[i][j])
for(int k=0;k<4;k++)
{
x=i+move[k][0];
y=j+move[k][1];
if(check(x,y))
{
_map[i+j*m][x+y*m]=1;
//printf("map[%d][%d]\n",i+j*m,x+y*m);
}
}
}
int ans=MaxMatch();
if(ans*2==m*n-k)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: