二分图最大匹配值的模板

/* **************************************************************************
//二分图匹配(匈牙利算法的DFS实现)
//初始化:g[][]两边顶点的划分情况
//建立g[i][j]表示i->j的有向边就可以了,是左边向右边的匹配
//g没有边相连则初始化为0
//uN是匹配左边的顶点数,vN是匹配右边的顶点数
//调用:res=hungary();输出最大匹配数
//优点:适用于稠密图,DFS找增广路,实现简洁易于理解
//时间复杂度:O(VE)
//***************************************************************************/
//顶点编号从0开始的
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 550;
int uN, vN;//u,v数目
int g[MAXN][MAXN];
int linker[MAXN];
bool used[MAXN];

bool dfs(int u)//从左边开始找增广路径
{
    int v;
    for(v=0; v<vN; v++)//这个顶点编号从0开始,若要从1开始需要修改
      if(g[u][v] && !used[v])
      {
          used[v] = true;
          if(linker[v]==-1 || dfs(linker[v]))
          {//找增广路,反向
              linker[v] = u;
              return true;
          }
      }
    return false;//这个不要忘了,经常忘记这句
}
int hungary()
{
    int res = 0;
    int u;
    memset(linker, -1, sizeof(linker));
    for(u=0; u<uN; u++)
    {
        memset(used,0,sizeof(used));
        if(dfs(u))
            res++;
    }
    return res;
}
时间: 2024-11-03 20:39:37

二分图最大匹配值的模板的相关文章

【算法小总结】二分图最大匹配的非递归方法

二分图最大匹配的非递归方法   代码: #define SIZE 100 int mat[SIZE][SIZE]; /*图矩阵*/ int match1[SIZE]; int match2[SIZE]; int queue[SIZE]; int head,tail; int pre[SIZE]; int maxMatch(int N){ int ret = 0; memset(match1,-1,sizeof(match1)); memset(match2,-1,sizeof(match2));

二分图最大匹配

一.理论准备         这两天看到了图论的二部图,闲着没事就水了一道.         先看增广路的定义:增广路,也称增广轨或交错轨: 若P是图G中一条连通两个未匹配顶点的路径,并且属于M的边和不属于M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径.         由增广路的定义可以推出下述三个结论: P的路径长度必定为奇数,第一条边和最后一条边都不属于M. 不断寻找增广路可以得到一个更大的匹配M',直到找不到更多的增广路,M为G的最大匹配当且仅当不存在M的增

图的匹配问题与最大流问题(五)计算二分图的最大匹配

二分图的最大匹配问题第一篇已经说过,下面看看百度百科给的一些解释: 给定一个二分图G,M为G边集的一个子集,如果M满足当中的任意两条边都不依附于同一个顶点,则称M是一个匹配. 极大匹配(Maximal Matching)是指在当前已完成的匹配下,无法再通过增加未完成匹配的边的方式来增加匹配的边数.最大匹配(maximum matching)是所有极大匹配当中边数最大的一个匹配.选择这样的边数最大的子集称为图的最大匹配问题. 如果一个匹配中,图中的每个顶点都和图中某条边相关联,则称此匹配为完全匹配

CLI+Terraform简化资源管理的模板编写

Terraform是一个比较强大的自动化资源编排管理工具,通过模板描述资源,通过apply命令创建/更新资源.详细的使用方法及特性可以参见公众号中关于Terraform的其他文章了解.本文将主要讲解如何利用CLI+Terraform简化模板的编写. Terraform的模板由几大结构组成:资源(resource).变量(variable).输出(output),他还有一个很重量级的结构:数据源(data).数据源是用来过滤资源中parameter的可选项的,举个例子,ECS的实例类型(insta

XSL的模板规则

模板 <xsl:template>标签内的文本内容描述了转换结果的形式,称为输出模板.属性match的取值把模板规则与指定的元素或属性相比较,只有匹配的DOM节点才会被处理,其余的节点将被忽略.整个过程中最先匹配的是树的根节点,根节点用"/"表示: <xsl:template match="/"> output template for root element </xsl:template> 然后匹配其他节点,此时,只要在引号中

PHP-Web应用程序开发:使用模板

web|程序|模板 每个进行过较大型的PHP-Web应用程序设计的开发人员大概都有如下的经历:花大量的时间写超文本语句,为页面排版,兼作美工等:或在整合的程序代码在和HTML静态页面时花费大量的时间.的确,用脚本语言开发Web应用不容易将数据的处理和数据的显示分开,但在多人合作的情况下,如果无法将数据和显示分开,将大大影响开发的效率,专业分工的发挥.为了解决这个问题,PHP也提供了自己的解决方案,有多种,本文主要介绍PHPLIB中的Template类. 1 模板处理类的设计 模板处理类主要需完成

PHP-Web 应用程序开发:使用模板

web|程序|模板 每个进行过较大型的 PHP-Web 应用程序设计的开发人员大概都有如下的经历:花大量的时间写超文本语句,为页面排版,兼作美工等:或在整合的程序代码在和HTML静态页面时花费大量的时间.的确,用脚本语言开发 Web 应用不容易将数据的处理和数据的显示分开,但在多人合作的情况下,如果无法将数据和显示分开,将大大影响开发的效率,专业分工的发挥.为了解决这个问题,PHP 也提供了自己的解决方案,有多种,本文主要介绍 PHPLIB 中的 Template 类. 一.模板处理类的设计 模

C++中函数模板(function template) 的 推进(forward) 问题

函数模板在调用函数的时候, 由于实参(argument)转换形参(parameter)的时候, 会发生改变, 导致无法保留原实参的信息, 即推进(forward)问题; 主要包括: 引用和右值;引用, 即因为模板参数非引用, 导致复制操作, 无法提供引用类型;右值, 即因为模板参数只能转换为左值, 无法提供右值; 解决方法: 引用: 使用右值参数(T&& t), 可以保证传递引用不发生改变; 右值:使用右值参数, 再使用forward()函数(#include<utility>

C++/CLR泛型与C++模板之间的对比

Visual Studio 2005把泛型编程的类型参数模型引入了微软.NET框架组件.C++/CLI支持两种类型参数机制--通用语言运行时(CLR)泛型和C++模板.本文将介绍两者之间的一些区别--特别是参数列表和类型约束模型之间的区别. 参数列表又回来了 参数列表与函数的信号(signature)类似:它标明了参数的数量和每个参数的类型,并把给每个参数关联一个唯一的标识符,这样在模板定义的内部,每个参数就可以被唯一地引用. 参数在模板或泛型的定义中起占位符(placeholder)的作用.用