匈牙利算法是由匈牙利数学家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. 在ASP.NET Core中使用Angular2,以及与Angular2的Token base身份认证

    注:下载本文提到的完整代码示例请访问:How to authorization Angular 2 app with asp.net core web api 在ASP.NET Core中使用Angu ...

  2. Python学习--Python 环境搭建

    Python环境搭建 Python是跨平台的编程语言,可应用于Windows.Linux.Mac OS X.你可以通过终端窗口输入"python"命令来查看本地是否安装了Pytho ...

  3. Android组件化和插件化开发

    http://www.cnblogs.com/android-blogs/p/5703355.html 什么是组件化和插件化? 组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Modul ...

  4. python的错误和异常

    python错误和异常 错误 错误分为语法错误和逻辑错误 语法错误 >>> if File "<stdin>", line 1 if ^ Syntax ...

  5. [Android]学习笔记Activity_001

    操作button的说明 设置button的ID: android:id="@+id/button" 设置button的点击事件 findViewById(R.id.button). ...

  6. ip地址库 新浪,淘宝

    原文连接地址:http://www.9958.pw/post/city_ip function getAddressFromIp($ip){ $urlTaobao = 'http://ip.taoba ...

  7. Believe Me , I Can !

    Believe Me , I Can ! ---DF 第一阶段:(年底1-27之前) 1.  熟练使用JavaScript/CSS/HTML,熟悉HTML5 / CSS3: 2.  熟悉JavaScr ...

  8. tomcat集群学习记录1--初识apache http server

    起因 平时开发的时候我都是用eclipse把代码部署到本地tomcat的,当然只会去跑1台tomcat啦... 偶尔有时候解决问题需要去公司测试环境找日志.连上公司测试环境以后发现竟然有2台weblo ...

  9. 强有力的Linux历史命令 你还记得几个

    列出所有出现到的命令:(所有一下信息都可以通过man history得到,而且还更多) history:列出历史中执行过的命令(-c清除所有的命令历史) !N:执行编号为N的历史命令 !-N:执行倒数 ...

  10. 【09-26】hibernate学习笔记

    主键生成策略 @Id //根据底层数据库决定,mysql-->auto_increment @GeneratedValue(strategy=GenerationType.AUTO) //使用数 ...