二分图的扩展

下面给出关于二分图最大匹配的两个定理:

1:最大匹配数 + 最大独立集 = n + m
2:二分图的最小覆盖数 = 最大匹配数
3:最小路径覆盖 = 最大独立集

最大独立集是指求一个二分图中最大的一个点集,该点集内的点互不相连。
最小顶点覆盖是指 在二分图中,用最少的点,让所有的边至少和一个点有关联。
最小路径覆盖是指一个不含圈的有向图 G 中,G 的一个路径覆盖是一个其结点不相交的路径集合 P,图中的每一个结点仅包含于 P 中的某一条路径。路径可以从任意结点开始和结束,且长度也为任意值,包括 0

附写一份自己的二分图的dfs模板算法:(+样题)

HDU 题目  过山车

RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,

就是每个女生必须找 个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,

Grass只愿意 和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner。考虑到经费问题,boss刘决定

只让找到 partner的人去坐过山车,其他的人,嘿嘿,就站在下面看着吧。聪明的Acmer,你可以帮忙算算最多有多少对组合可以坐上过山车吗?

Input

输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000
1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。

Output

对于每组数据,输出一个整数,表示可以坐上过山车的最多组合数。

Sample Input

6 3 3

1 1

1 2

1 3

2 1

2 3

3 1

0

Sample Output

3

代码:

#include <stdio.h>
#include <string.h>
#define N 510

int m, n, k ;
int map[N][N];
int vt[N];
int link[N];

int dfs(int dd)
{
    int i;
    for(i=0; i<m; i++)
    {
        if(map[dd][i]==1 && vt[i]==0 )
        {
            vt[i]=1;
            if(link[i]==-1 ||dfs(link[i]) )
            {
                link[i]=dd;
                return 1;
            }
        }
    }
    return 0;
}

int main()
{
    int i;
    int cnt;
    int ff, u, v;
    while( scanf("%d", &n) && n!=0 )
    {
        scanf("%d %d", &m, &k );
        memset(map, 0, sizeof(map));
        memset(link, -1, sizeof(link));

        for(i=0; i<k; i++)
        {
            scanf("%d %d %d", &ff, &u, &v );
			if(u>0 && v>0)
            map[u][v] = 1;
        }
        cnt=0;
        for(i=0; i<n; i++)
        {
            memset(vt, 0, sizeof(vt));
            cnt+=dfs(i);
        }
        printf("%d\n", cnt );
    }
    return 0;
}

二分图的扩展

时间: 2024-09-29 08:47:54

二分图的扩展的相关文章

UVA 11383 - Golden Tiger Claw(二分图完美匹配扩展)

UVA 11383 - Golden Tiger Claw 题目链接 题意:给定每列和每行的和,给定一个矩阵,要求每个格子(x, y)的值小于row(i) + col(j),求一种方案,并且所有行列之和的和最小 思路:A二分图完美匹配的扩展,行列建二分图,权值为矩阵相应位置的值,做一次KM算法后,所有顶标之和就是最小的 代码: #include <cstdio> #include <cstring> #include <cmath> #include <algor

二分图最大匹配问题及其扩展

二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图. 二分图的最大匹配: 匈牙利算法 完美匹配: 如果所有点都在匹配边上,称这个最大匹配是完美匹配. 最小覆盖: 最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联.可以证明:最少的点(即覆盖数)=最大匹配数 最小路径覆盖:

POJ 2226二分图最大匹配

匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. #include<stdio.h> #include<string.h> #include<stdlib.h> int n1,n2; char map[1005][1005]; //数组开大点 int mapx[1005][1005],mapy[1005]

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

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

【网络流-二分图最大匹配】poj3041Asteroids

/* 这道题将每行x看成是结点x,没列y看成是结点y,而障碍物的坐标xy看成是从x到y的 一条边.建图后问题就变成了,找最少的点,使得这些点与所有的边相邻,即最小 点覆盖,用匈牙利算法解决. ------------------------------- 定理:最小点覆盖数 = 最大匹配数,即求图的最大匹配即可,匈牙利算法 ------------------------------- 模板讲解: bool find(int v) { for(int i=1; i<=n; i++) { if(g

【巨坑】 二分图学习笔记 [2017年6月计划 学习二分图]

1.二分图:    ①把一个图的点集划为两个不相交的集合U,V,使得每一条边都连接U,V中的节点. ②(等价定义,更方便看)不含边数为奇数的环的图 2.匹配(matching): 边集,每一条边所连顶点互不相同 3.最大匹配: 所含边数最大的匹配 4.完美匹配: 所有顶点都被匹配,完美匹配一定是最大匹配. 5.交替路: 从一个非匹配点出发,依次走非匹配边,匹配边,非匹配边....交替走,形成交替路 6.增广路: 从一个非匹配点出发,走交替路,经过另一个非匹配点,则这条路径叫做增广路   增广路特

二分图的最大匹配

转载自http://blog.csdn.net/pi9nc/article/details/11848327 二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图.准确地说:把一个图的顶点划分为两个不相交集 U  和 V ,使得每一条边都分别连接U . V  中的顶点.如果存在这样的划分,则此图为一个二分图.二分图的一个等价定义是:不含有「含奇数条边的环」的图.图 1 是一个二分图.为了清晰,我们以后都把它画成图 2 的形式. 匹配:在图论中,一个「匹配」

hiho 第117周 二分图多重匹配,网络流解决

描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上. 已知小Hi和小Ho所在的班级一共有N名学生(包含小Hi和小Ho),编号依次为1..N. 运动会一共有M项不同的比赛,编号为1..M.第i项比赛每个班需要派出m[i]名选手参加. 根据小Hi和小Ho的统计,编号为i的学生表示最多同时参加a[i]项比赛,并且给出他所擅长的b[i]项比赛的编号. 小Hi和小Ho希望将每个学生都安排到他所擅长的比赛项目,

kuangbin带你飞 匹配问题 二分匹配 + 二分图多重匹配 + 二分图最大权匹配 + 一般图匹配带花树

二分匹配:二分图的一些性质 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图. 1.一个二分图中的最大匹配数等于这个图中的最小点覆盖数 König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数.如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选