zoukankan      html  css  js  c++  java
  • 匈牙利算法

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

    之前在学离散的时候学习到二分图的时候没听说过这个算法,后来校级c程序设计大赛用到了二分图匹配才学习这个算法。

    这个算法的目的就是找到使二分图能一 一配对的最大值。

    比如给男女配对的时候要尽可能多的将互有好感的男女配对。

    1、从编号为1的男生开始

    2、找与他有暧昧关系的女生,标记女生。

    3、判断该女生是否有男朋友,如果没有那这个男生就可以做她男朋友,返回真。

    4、否则判断是否她的男朋友能不能从他其它有暧昧的女生里找到女朋友。(即重复2、3、4(递归))

    5、可以,重新牵手,返回真。

    6、否则返回假。

    例题

    问题 E: DATE ALIVE
    时间限制: 1 Sec  内存限制: 128 MB
    提交: 47  解决: 17
    [提交][状态][讨论版]
    题目描述

    五河士道家里的精灵越来越多了,而每一个精灵都想和他有一个约会。然而五河士道却只有一个,无奈之下只能使出分身帮自己解围。

    不过并不是所有的精灵都同意这样做,有些精灵不愿意和士道分身进行约会,也有部分精灵同时选择同一个分身进行约会。

    假设有N个分身,精灵的数量为M,可能的约会组合有K组。

    设N=3,M=5,K=5,可能的组合为1-1,1-3,2-4,3-4,3-5(如下图),为了避免冲突,我们最多可以选择1-1,2-4,3-5一共三种组合(或者是1-3,2-4,3-5)

    那么请设计一个程序判断每一次可能的组队最多能确定多少队伍?最后,让我们的约会开始吧~

    输入

    输入N,M,K

    N,M,K为正整数

    1<=N<=500

    1<=M<=500

    接下来K行,输入u,v,表示uv之间愿意组队

    u在N的范围内,v在M的范围内

    输出

    输出最大组队数目

    样例输入
    3 5 5
    1 1
    1 3
    2 4
    3 4
    3 5
    
    样例输出
    3
     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<string.h>
     4 #include<algorithm>
     5 #include<vector>
     6 using namespace std;
     7 int n,m,k;
     8 bool gx[550][550];
     9 int girl[550];
    10 bool used[550];
    11 bool dfs(int i){
    12     for(int j=1;j<=m;j++){
    13         if(gx[i][j]&&!used[j]){
    14             used[j]=1;  //标记,避免后面无法跳出递归
    15             if(!girl[j]||dfs(girl[j])){
    16                 girl[j]=i;
    17                 return true;
    18             }
    19         }
    20     }
    21     return false;
    22 }
    23 int hungary(){
    24     int cnt=0;
    25     for(int i=1;i<=n;i++){
    26         memset(used,0,sizeof(used)); //清除标记
    27         if(dfs(i))  cnt++;
    28     }
    29     return cnt;
    30 }
    31 int main(){
    32     cin>>n>>m>>k;
    33     while(k--){
    34         int x,y;
    35         scanf("%d%d",&x,&y);
    36         gx[x][y]=true;
    37     }
    38     cout<<hungary()<<endl;
    39     return 0;
    40 }
    
    
    

    题目链接http://oj.jxust.edu.cn/problem.php?cid=1251&pid=4

    匈牙利算法其他详解:赞一个!http://blog.csdn.net/dark_scope/article/details/8880547


  • 相关阅读:
    运行客户端程序报读取配置文件出错的解决方案
    速达软件二次开发-销售开单结算单位和账期报表需求
    速达软件开发版客户端启用流程
    vue 从后台获取数据并渲染到页面
    postgreSQL更改表的数据类型
    mybatis-plus实现多表联查
    mybatis学习笔记(四)
    mybatis学习笔记(三)
    mybatis学习笔记(二)
    mybatis学习笔记(一)
  • 原文地址:https://www.cnblogs.com/ISGuXing/p/8012478.html
Copyright © 2011-2022 走看看