POJ 2446Chessboard(二分图最大匹配)

原创 2014年06月04日 20:03:30

题目地址:http://poj.org/problem?id=2446

这题重点在于如何建图,费了一番脑筋。。突然想到只要能保证相邻的分别在两个集合中就可以了,然后就想到了把横坐标与纵坐标之和为奇数的归为X集合,偶数的归为Y集合(画下图就能明白了。。。)。这样的话就可以保证每对相邻的不在同一个集合中。剩下的工作就是匹配了。解决了构图,就很简单了。此题还有一个小小的剪枝技巧,也很好想到,就是如果剩下的格子是奇数个的话,就可以直接输出NO了,道理很简单,不用说了吧。

代码如下:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include<algorithm>
using namespace std;
int jx[]= {0, 0, 1, -1};
int jy[]= {1,-1,0,0};
int mp[2000][2000], vis[2000], link[2000], a[2000], b[2000], mmp[1000][1000], k1, k2, n, m;//mmp表示题目的图,mp是建的二分图。
int dfs(int x)
{
    int i, j;
    for(i=0; i<k2; i++)
    {
        if(!vis[b[i]]&&mp[x][b[i]])
        {
            vis[b[i]]=1;
            if(link[b[i]]==-1||dfs(link[b[i]]))
            {
                link[b[i]]=x;
                return 1;
            }
        }
    }
    return 0;
}
void hungary(int k)
{
    int i, ans=0;
    memset(link,-1,sizeof(link));
    for(i=0; i<k1; i++)
    {
        memset(vis,0,sizeof(vis));
        if(dfs(a[i]))
            ans++;
    }
    //printf("%d\n",ans);
    if(ans*2+k==n*m)
        printf("YES\n");
    else
        printf("NO\n");
}
int main()
{
    int k, x, y, i, j, k0;
    scanf("%d%d%d",&n,&m,&k);
    memset(mmp,0,sizeof(mmp));
    memset(mp,0,sizeof(mp));
    for(i=0; i<k; i++)
    {
        scanf("%d%d",&x,&y);
        mmp[y-1][x-1]=1;
    }
    if((n*m-k)%2)
    {
        printf("NO\n");
        return 0;
    }
    k1=0;
    k2=0;
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            if((i+j)%2)
            {
                if(!mmp[i][j])
                    a[k1++]=m*i+j;
            }
            else
            {
                if(!mmp[i][j])
                    b[k2++]=m*i+j;
            }
        }
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            if(!mmp[i][j])
            {
                for(k0=0; k0<4; k0++)
                {
                    int a=i+jx[k0];
                    int b=j+jy[k0];
                    if(a>=0&&a<n&&b>=0&&b<m&&!mmp[a][b])
                    {
                        mp[m*i+j][m*a+b]=1;
                    }
                }
            }
        }
    }
    hungary(k);
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

poj2195(二分图最大匹配,最小费用流)

Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 21120   Accepted: 1066...
  • martinue
  • martinue
  • 2016年05月30日 17:55
  • 808

二分图的最大匹配问题完整代码

二分图的最大匹配问题很多博客原理讲的已经很清楚了,贴出来几个链接: 二分图的最大匹配问题解决原理 二分图最大匹配原理 自己花了两天时间敲出来的代码,感觉成长了很多: #include ...
  • bbtl_ast
  • bbtl_ast
  • 2017年06月06日 14:12
  • 661

二分图最大匹配例题

例题1:HDU 1083&&POJ 1469 Courses Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/327...
  • u012294939
  • u012294939
  • 2015年02月12日 15:32
  • 2585

二分图最大匹配(模板+题目)

定义和定理: 最大匹配数:最大匹配的匹配边的数目 最小点覆盖数:选取最少的点,使任意一条边至少有一个端点被选择 最大独立数:选取最多的点,使任意所选两点均不相连 最小路径覆盖数:对于一个 DAG(有...
  • guhaiteng
  • guhaiteng
  • 2016年09月05日 20:48
  • 1024

二分图的最大匹配、完美匹配和匈牙利算法

二分图的最大匹配、完美匹配和匈牙利算法 2013-08-01Algorithms二分图匹配, 图论, 算法 这篇文章讲无权二分图(unweighted bipartite graph)的最...
  • pi9nc
  • pi9nc
  • 2013年09月20日 15:38
  • 63709

详解二分图的最大匹配

一天一算法二分图的匹配算法——最大匹配基本概念:二分图本身的概念就不解释了。这里主要介绍一下增广路。也有人称它为交错路。之所以称它为交错路是因为在这条路径上,未匹配边和匹配边是交替出现的。之所以称它为...
  • coder_yuanxl
  • coder_yuanxl
  • 2016年04月14日 21:05
  • 560

二分图的基本概念+二分图的最大匹配问题(匈牙利算法)

今天学了二分图的最大匹配,其中的匈牙利算法。。哦不,其实远不止这个,还有后面的一系列KM、开花树啊什么的算法。反正又是一个异常懵逼的一天。。。 我觉得应该是上课前没有稍微预习一下这个算法是什么,了解个...
  • x_y_q_
  • x_y_q_
  • 2016年07月15日 20:05
  • 2892

二分图最大匹配 最大增广路径 递归法

二分图的最大匹配增广路径法 递归实现 //分别定义左右最大元素数量#define Left_Max 101#define Right_Max 301//匹配标志!!!!!在DFS遍历中寻找增广路径的时...
  • GoOnDrift
  • GoOnDrift
  • 2010年08月23日 22:53
  • 1278

#1122 : 二分图二•二分图最大匹配之匈牙利算法

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上一回我们已经将所有有问题的相亲情况表剔除了,那么接下来要做的就是安排相亲了。因为过年时间...
  • wang2534499
  • wang2534499
  • 2015年07月25日 10:51
  • 488

二分图最大匹配与其应用

部分定义 传递闭包一个图。如果图GG中点ii到点jj存在通路,那么在传递闭包中有边i−>ji->j 二分图一个图GG,可以将其所有点分成x,yx,y两个点集,同时所有边满足他的两个端点分别落在x,yx...
  • jokerwyt
  • jokerwyt
  • 2016年05月07日 10:22
  • 999
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2446Chessboard(二分图最大匹配)
举报原因:
原因补充:

(最多只允许输入30个字)