匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n1,n2;
char map[][]; //数组开大点
int mapx[][],mapy[][];
int ma[][];//邻接矩阵true代表有边相连
int result[],visit[];
int x,y; int find(int a){
int i;
for(i=;i<=y;i++){
if(!visit[i]&&ma[a][i]){//如果节点i与a相邻并且未被查找过
visit[i]=;//标记i为已查找过
if(!result[i]||find(result[i])){//如果i未在前一个匹配M中或者i在匹配M中,但是从与i相邻的节点出发可以有增广路
result[i]=a;//记录查找成功记录
return ;
}
}
}
return ;
} int main(){
int i,j,ans;
while(scanf("%d%d",&n1,&n2)!=EOF){
for(i=;i<n1;i++){
scanf("%s",map[i]);
}
memset(mapx,,sizeof(mapx));
memset(mapy,,sizeof(mapy));
x=;
for(i=;i<n1;i++){
for(j=;j<n2;j++){
if(map[i][j]=='*'){
++x;
while(j<n2&&map[i][j]=='*'){
mapx[i][j]=x;
j++;
}
}
}
}
y=;
for(j=;j<n2;j++){
for(i=;i<n1;i++){
if(map[i][j]=='*'){
++y;
while(i<n1&&map[i][j]=='*'){
mapy[i][j]=y;
i++;
}
}
}
} for(i=;i<n1;i++){
for(j=;j<n2;j++){
ma[mapx[i][j]][mapy[i][j]]=;
}
} ans=; memset(result,,sizeof(result));
for(i=;i<=x;i++){
memset(visit,,sizeof(visit));//清空上次搜索时的标记
ans+=find(i); //从节点i尝试扩展
}
printf("%d\n",ans);
}
return ;
}

http://blog.csdn.net/pi9nc/article/details/11848327

POJ 2226二分图最大匹配的更多相关文章

  1. poj 2239 二分图最大匹配,基础题

    1.poj 2239   Selecting Courses   二分图最大匹配问题 2.总结:看到一个题解,直接用三维数组做的,很巧妙,很暴力.. 题意:N种课,给出时间,每种课在星期几的第几节课上 ...

  2. POJ Evacuation /// 二分图最大匹配

    题目大意: 在一个n*m的房间中 ‘X’为墙 ‘D’为门 ‘.’为人 门只存在与外围 人每秒钟只能向四连通区域走一步 门比较狭窄 每秒钟只能通过一个人 求所有人逃脱的最短时间 如果不可能则输出impo ...

  3. poj 2724 二分图最大匹配

    题意: 会给出M个串,我们要做的就是将这M个串给清除了.对于任意两个串,若二进制形式只有一位不一样,那么这两个串可以在一次操作消除,否则每个操作只能消除一个串. 3 3 *01 100 011 可以代 ...

  4. poj 2226 二分图 最小点覆盖 , 最大流

    题目就是问怎样用最小的板覆盖全部的草地.能够横着放.也能够竖着放,同意一个草地放多个点. 建图方法就是 每一个横向的草地作为X,纵向连续的草地作为Y.     X连接Y的边表示,  这里有他们的公共点 ...

  5. Asteroids - poj 3041(二分图最大匹配问题)

      Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17258   Accepted: 9386 Description Be ...

  6. poj 2446 二分图最大匹配

    思路:由(i+j)为偶数的点向(i+j)为奇数的点建边.求一次最大匹配,若正好为空格数(不包含洞)的一半,即输出YES. #include<iostream> #include<cs ...

  7. poj 1469 二分图最大匹配

    就是最简单的最大匹配,没的说 #include<iostream> #include<cstdio> #include<cstring> #include<a ...

  8. poj 1469(二分图 最大匹配)

    这道题让我认识到了c++cin,cout确实会使其超时,还是我用的c printf吧 #include<cstdio> #include<iostream> #include& ...

  9. POJ 2226 二分图最小覆盖

    题意: 思路: 把横着的连通块放在一个集合 竖着的放在一个集合 如果有交 就连边 求最小覆盖即可 (数值上等于最大匹配) //By SiriusRen #include <cstdio> ...

随机推荐

  1. Junit的使用

    Junit是用于编写单元测试的框架.对于已经写好的函数,可以使用Junit生成单元测试代码. 自己的环境是:Linux Java环境是:JDK1.7 IDE:Eclipse Java EE IDE f ...

  2. 【BZOJ-2653】middle 可持久化线段树 + 二分

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1298  Solved: 734[Submit][Status][Discu ...

  3. 【poj2409】 Let it Bead

    http://poj.org/problem?id=2409 (题目链接) 题意 一个n个珠子的项链,每个珠子可以被染成t种颜色.项链可以翻转和旋转,问不同的染色方案数. Solution Pólya ...

  4. GStreamer 记录

    GStreamer 是一个新的多媒体框架,大大简化了多媒体工具的开发流程,比如,这里有一个 IBM 的文档,介绍了一个 MP3 播放器. http://www.ibm.com/developerwor ...

  5. 用pyspider爬淘宝MM照片

    #!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2016-12-09 15:24:54 # Project: taobaomm ...

  6. Docker 清理命令集锦

    杀死所有正在运行的容器 复制代码代码如下: docker kill $(docker ps -a -q) 删除所有已经停止的容器 复制代码代码如下: docker rm $(docker ps -a ...

  7. ASP.NET 判断客户端是否为手机的函数

    http://www.cnblogs.com/cxd4321/p/3795911.html

  8. Java集合之HashSet

    1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素.HashSe ...

  9. springmvc @responsebody 406/415问题解决

    提供几个解决思路 1.如果项目中用的spring jar包是4.x版本, 需要jackson-annotations-2.x/jackson-core-2.x/jackson-databind-2.x ...

  10. hibernate学习四(关系映射一对一与组件映射)

    一.关系映射简介 在数据库中,表与表的关系,仅有外键.但使用hibernate后,为面向对象的编程,对象与对象的关系多样化:如 一对一,一对多,多对多,并具有单向和双向之分. 开始练习前,复制上一次项 ...