匈牙利算法求二分图求最大匹配

  无向图匈牙利算法求地的值除以2才是答案,因为每个边都匹配了两次,有向图算法得出的就是答案。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int maps[50][50],match[50],vis[50],n;
bool Find(int u)
{
    cout<<"the fa = "<<u<<endl;
    for(int i = 1; i <= n; i++)
    {
        if(maps[u][i])
        {
            if(!vis[i])
            {
                vis[i] = 1;
                if(match[i] == -1 || Find(match[i]))
                {
                    cout<<"the son = "<<i<<endl;
                    match[i] = u;
                    return true;
                }
                else cout<<"don‘t find his son"<<endl;
            }
        }
    }
    return false;
}
int slove()
{
    memset(match,-1,sizeof(match));
    int ans = 0;
    for(int i = 1; i <= n; i++)
    {
        memset(vis,0,sizeof(vis));
        if(Find(i))
        ans++;
    }
    return ans;
}
int main()
{
    int m,a,b,t;
    ///freopen("Ain.txt","r",stdin);
    cin>>t;
    while(t--)
    {
        memset(maps,0,sizeof(maps));
        cin>>n>>m;
        while(m--)
        {
            cin>>a>>b;
            maps[b][a] = 1;
            maps[a][b] = 1;
        }
        int ans = slove();
        cout<<"ans = "<<ans/2<<endl;
    }
    return 0;
}
时间: 2024-10-17 16:25:49

匈牙利算法求二分图求最大匹配的相关文章

匈牙利算法解决二分图匹配

匈牙利算法解决二分图匹配 [书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程] 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. -------等等,看得头大?那么请看下面的版本: 通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一位光荣的新世纪媒人,在你的手上有N个剩男,M个剩女,每个人都可

用匈牙利算法求二分图的最大匹配

转载大神的!! 什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到.二分图的最大匹配有两种求法,第一种是最大流(我在此假设读者已有网络流的知识):第二种就是我现在要讲的匈牙利算法.这个算法说白了就是最大流的算法,但是它跟据二分图匹配这个问题的特点,把最大流算法做了简化,提高了效率.匈牙利算法其实很简单,但是网上搜不到什么说得清楚的文章.所以我决定要写一下. 最大流算法的核心问题就是找增广路径(augment path).匈牙利算法也不例外,它的基本模式就是: 初始时最大匹

匈牙利算法求二分图的最大匹配数

给定一个二分图,其中左半部包含n1n1个点(编号1~n1n1),右半部包含n2n2个点(编号1~n2n2),二分图共包含m条边. 数据保证任意一条边的两个端点都不可能在同一部分中. 请你求出二分图的最大匹配数. 二分图的匹配:给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配. 二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数. 输入格式 第一行包含三个整数 n1n1. n2n2 和 mm. 接下

FOJ 2232 匈牙利算法找二分图最大匹配

题目链接 简单理解匈牙利算法 简单理解二分图 尽量让每一个随从击败一个对手且随从全部存活,关键是为每一个随从找对手(递归过程),"腾". #include<iostream> #include<cstdio> #include<cstring> using namespace std; int used[110]; int g[110][110]; //建立随从和对手的对战关系 int ee[110]; int n; struct people{ i

Hungary(匈牙利算法)——二分图最大匹配

在复习匈牙利算法的时候,发现这么一篇介绍匈牙利算法的文章,非常通俗易懂,所以就借鉴过来了. 复杂度:邻接矩阵:O(v^3)邻接表:O(V*E) 附上链接:趣写算法系列之--匈牙利算法 下面就附上代码吧: int maxn;//maxn 为x.y集合的最大顶点数 int xmatch[maxn]; //xmatch[i]表示X集合中的i在Y集合中对应的匹配 int ymatch[maxn]; //ymatch[i]表示Y集合中的i在X集合中对应的匹配 int map[maxn][maxn]; //

匈牙利算法(二分图)

                                                                                                            ---------------------------------------------------------------------题材大多来自网络,本篇由神犇整理 基本概念—二分图 二分图:是图论中的一种特殊模型.若能将无向图G=(V,E)的顶点V划分为两个交集为空的顶点集,

二分图&amp;&amp;匈牙利算法(二分图基本算法)

二分图 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图. 区别二分图,关键是看点集是否能分成两个独立的点集.如下图所示 二分图的最大匹配 给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,则称M是一个匹配. 选择这样的边数最大的子集称为图的最大匹配问题(maxim

【匈牙利算法】 二分图模板 poj 1274

#include <iostream> #include <cstdio> #include <memory.h> using namespace std; int n,m,num,temp,sum; int re[201][201],link[201];//牛与牛栏的对应关系 bool tag[201];//增益路径 bool DFS(int a) { for(int i=1;i<=m;i++) { if(re[a][i]!=0 && !tag[

&quot;《算法导论》之‘图’&quot;:不带权二分图最大匹配(匈牙利算法)

博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利算法 1. 前言 二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图.准确地说:把一个图的顶点划分为两个不相交集 U 和V ,使得每一条边都分别连接U.V中的顶点.如果存在这样的划分,则此图为一个二分图.二分图的一个等价定义是:不含有「含奇数条边的环」的图.