匈牙利算法--java
先上例题
杭电acm 2063 :http://acm.hdu.edu.cn/showproblem.php?pid=2063
bool 寻找从k出发的对应项出的可增广路
{
while (从邻接表中列举k能关联到顶点j)
{
if (j不在增广路上)
{
把j加入增广路;
if (j是未盖点 或者 从j的对应项出发有可增广路)
{
修改j的对应项为k;
则从k的对应项出有可增广路,返回true;
}
}
}
则从k的对应项出没有可增广路,返回false;
}
void 匈牙利hungary()
{
for i->1 to n
{
if (则从i的对应项出有可增广路)
匹配数++;
}
输出 匹配数;
}
附上题解代码
import java.util.*;
public class Main {
public int map[][]=new int [1010][1010];//男生和女的有关系数
public int match[]=new int[1010]; //是否已经匹配数
public int used[]=new int [1010]; //是否有关系
public boolean find(int x,int n ){
for(int i=1;i<=n;i++){
if(used[i]==0&&map[x][i]==1){ //如果没有i男生是空闲的且x,i有关系
used[i]=1;
if(match[i]==-1||find(match[i],n)){ //如果i男生没有匹配或者她放弃男生i并且另外找到了自己的伴
match[i]=x;
return true;
}
}
}return false;
} //该函数判断女生爱能不能找到伴
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int k,m,n;
while(sc.hasNext()){
k=sc.nextInt();
if(k==0)
System.exit(0);
m=sc.nextInt();
n=sc.nextInt();
int cnt=0;
Main lei=new Main();
Arrays.fill(lei.match,-1);
for(int i=0;i<lei.map.length;i++){
for(int j=0;j<lei.map.length;j++){
lei.map[i][j]=0;
}
}
for(int i=1;i<=k;i++){
int a,b;
a=sc.nextInt();
b=sc.nextInt();
lei.map[a][b]=1;
}
for(int i=1;i<=m;i++){
Arrays.fill(lei.used,0);
if(lei.find(i,n))
cnt++;
}
System.out.println(cnt);
}
}
}
匈牙利算法精髓就是尽可能的多占,可以通过回溯来试,不过当试的时候破坏了之前的安排,则是无能为力的,只能要求尽可能的多。
杭电3020
package demo2;
import java.util.*;
public class Main6 {
static int edge[][]=new int [1005][1005];
static int num_map[][]=new int [1000][1001];
static char map[][]=new char[1000][1001];
static int cx[]=new int[505];
static int cy[]=new int[505];
static int vis[]=new int[505];
static int match[]=new int[505];
static int N,K,M;
static int d[][]={{-1,0},{1,0},{0,-1},{0,1}};
public static int path(int u){
int v;
for(v=1;v<=M;v++){
if(vis[v]==0&&edge[u][v]==1){
vis[v]=1;
if(match[v]==-1||path(match[v])==1){
match[v]=u;
return 1;
}
}
}
return 0;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
while(N-->0){
int count=0;
for(int i=0;i<num_map.length;i++)
Arrays.fill(num_map[i], 0);
for(int i=0;i<edge.length;i++)
Arrays.fill(edge[i], 0);
int m= sc.nextInt();
int k = sc.nextInt();
sc.nextLine();
for(int i=0;i<m;i++){
String s = sc.nextLine();
map[i]=s.toCharArray();
}
// int res=0;
int num=0;
for(int i=0;i<m;i++){
for(int j=0;j<k;j++){
// System.out.print([i][j]);
if(map[i][j]=='*'){
num_map[i][j]=++num;
// System.out.println(num_map[i][j]);
}
}
// System.out.println();
}
K=num;M=num;
System.out.println(num);
for(int i=0;i<m;i++){
for(int j=0;j<k;j++){
if(num_map[i][j]!=0){
// System.out.println(num_map[i][j]);
for(int c=0;c<4;c++){
int x = i+d[c][0];
int y = j+d[c][1];
if(x<0||y<0||x>=m||y>=k)
continue;
if(num_map[x][y]!=0)
edge[num_map[i][j]][num_map[x][y]]=1;
}
}
}
}
// for(int i=1;i<=m;i++){
// for(int j=1;j<=k;j++){
// System.out.print(num_map[i][j]);
// }
// System.out.println();
// }
Arrays.fill(match, -1);
for(int i=1;i<=K;i++){
Arrays.fill(vis, 0);
if(path(i)==1)
count++;
}
System.out.println(num-count/2);
}
}
}
匈牙利算法--java的更多相关文章
- HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))
Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- hdoj 1083 Courses【匈牙利算法】
Courses Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- hdoj 2063 过山车【匈牙利算法+邻接矩阵or邻接表】
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- [ACM] HDU 2063 过山车 (二分图,匈牙利算法)
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- HDU--3081--Marriage Match II--最大匹配,匈牙利算法
Marriage Match II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU2063-过山车-匈牙利算法
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 2444 - The Accomodation of Students - [二分图判断][匈牙利算法模板]
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2444 Time Limit: 5000/1000 MS (Java/Others) Mem ...
- HDU 1045 - Fire Net - [DFS][二分图最大匹配][匈牙利算法模板][最大流求二分图最大匹配]
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1045 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- hdu 1013 过山车 匈牙利算法(代码+详细注释)
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
随机推荐
- CentOS下配置SFTP操作日志
1.修改ssh的配置 vi /etc/ssh/sshd_config 在36行左右修改如下配置 Subsystem sftp /usr/libexec/openssh/sftp-server -l I ...
- [转]如何将mysql表结构导出成Excel格式的(并带备注)
方法一: 1.使用一个MySQL管理工具:SQLyog,点击菜单栏“数据库”下拉的最后一项: 导出的格式如下: 2.要想转成Excel格式的只需手动将该表复制到Excel中去. 方法二: 1.以下用的 ...
- HTML LIST 输入框自动查询追加框,自动过滤 HTML5
<!DOCTYPE HTML> <html> <body> <form action="/example/html5/demo_form.asp&q ...
- python全栈开发day61-django简单的出版社网站展示,添加,删除,编辑(单表的增删改查)
day61 django内容回顾: 1. 下载: pip install django==1.11.14 pip install -i 源 django==1.11.14 pycharm 2. 创建项 ...
- HDU2732 Leapin' Lizards 网络流 最大流 SAP
原文链接http://www.cnblogs.com/zhouzhendong/p/8362002.html 题目传送门 - HDU2732 题意概括 给你一个网格,网格上的一些位置上有一只蜥蜴,所有 ...
- day 58 bootstrap -part1
我们的bootstrap主要使用都是官网里面的内容,官网里面的都整理得很完备,有需要的时候就直接去里面找即可, 关于这个bootstrap,我所理解的就是,我们前面所学的那些,从html开始一直到后面 ...
- Django中的Request和Response
接触Django这么久了,从来没有好好学习关于Django中的Request和Response对象.借着文件上传下载的相关工作,现在总结一下也不错. 当一个页面请求过来,Django会自动创建一个Re ...
- 最小生成树-QS Network(Prim)
题目大意: 给出的案例结果得出步骤,如下图所示,从结点1开始查找,找出的一条路径如绿色部分所标注.(关键处在于连接每条路径所需要的适配器的价格得加上去) 代码实现: #include<iostr ...
- dp经典问题-最大连续子序列和 hdu1003
题目描述: 这道题我先后做过三遍,结果每一遍都没有做出来.今天再仔仔细细的研究了一下,才发现用动态规划更好理解. 关于求最大连续子序列和的博文转载如下:https://www.cnblogs.com/ ...
- pacman 命令
安装 pacman -S 删除 pacman -R 移除已安装不需要软件包 pacman -Rs 删除一个包,所有依赖 pacman -Rsc 升级包 pacman -Syu 查询包数据库 ...