POJ 2446 匈牙利算法

题意:
这里写图片描述
思路:
二分图匹配。。。

// by SiriusRen
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 1111
int n,m,k,xx[]={1,-1,0,0},yy[]={0,0,1,-1},jyx,jyy,T,fa[N],ans=0;
bool a[N][N],map[35][35],vis[N];
bool dfs(int x){
    for(int i=1;i<=T;i++)
        if(a[x][i]&&!vis[i]){
            vis[i]=1;
            if(!fa[i]||dfs(fa[i])){
                fa[i]=x;return 1;
            }
        }
    return 0;
}
int main()
{
    scanf("%d%d%d",&m,&n,&k),T=(m-1)*n+n;
    for(int i=1;i<=m;i++)map[i][0]=map[i][n+1]=1;
    for(int i=1;i<=n;i++)map[0][i]=map[m+1][i]=1;
    for(int i=1;i<=k;i++)scanf("%d%d",&jyy,&jyx),map[jyx][jyy]=1;
    for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)
        if(!map[i][j])for(int l=0;l<4;l++)
            if(!map[i+xx[l]][j+yy[l]])a[(i-1)*n+j][(i+xx[l]-1)*n+j+yy[l]]=1;
    for(int i=1;i<=T;i++,memset(vis,0,sizeof(vis)))if(dfs(i))ans++;
    if(ans+k==T)puts("YES");
    else puts("NO");
}

这里写图片描述

posted @ 2016-08-06 14:28  SiriusRen  阅读(115)  评论(0编辑  收藏  举报