zoukankan      html  css  js  c++  java
  • 二分图匹配

    二分图概念

    二分图:

    二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。

    简单的说,一个图被分成了两部分,相同的部分没有边,那这个图就是二分图,二分图是特殊的图。

    最大二分图匹配

    最常用的是匈牙利算法,实际上是一种贪心的策略,尽量使每一个点存在匹配。

    模板题

    代码

    
    const int maxn=1005;
    int n,m,t;
    int mch[maxn],vis[maxn];
    vector<int >g[maxn];
    bool dfs(int u,int tag)
    {
    	if(vis[u]==tag)return false;//应该是避免绕圈 
    	vis[u]=tag;
    	for(int i=0;i<g[u].size();i++)
    	{
    		int v=g[u][i];
    		if(mch[v]==0||dfs(mch[v],tag))//如果这个点未被匹配或者原先匹配的点可以找到别的匹配点 
    		{
    			mch[v]=u;
    			return true;
    		}
    	}
    	return false;
    }
    main(void)
    {
    	n=read();
    	m=read();
    	t=read();
    	while(t--)
    	{
    		int u=read();
    		int v=read();
    		g[u].push_back(v);
    	} 
    	int ans=0;
    	for(int i=1;i<=n;i++)
    	{
    		if(dfs(i,i))
    		{
    			ans++;
    		}
    	}
    	cout<<ans;
    }
    

    二分图最优匹配与km算法

    详解

    例题

    最小顶点覆盖

    定义:假如选了一个点就相当于覆盖了以它为端点的所有边。最小顶点覆盖就是选择最少的点来覆盖所有的边。

    定理:最小顶点覆盖等于二分图的最大匹配。

    最大独立子集

    定义:选出一些顶点使得这些顶点两两不相邻,则这些点构成的集合称为独立集。找出一个包含顶点数最多的独立集称为最大独立集。

    定理:最大独立集 = 所有顶点数 - 最小顶点覆盖 = 所有顶点数 - 最大匹配

  • 相关阅读:
    C#简单的工厂模式
    Microsoft.XMLHttp的属性和方法的简介及使用
    Google Earth 2007中文修订版
    偷懒秘笈之一键生成 Ajax Control Toolkit 标记 (转)
    C#获取硬盘序列号
    Google和百度、雅虎的站内搜索代码
    Visual Studio 2005 Team Suite 180 天试用版
    几种 Dotnet ORM 库的比较
    Windows Server 2003 SP2 0918 Personal 精简版
    通用水晶报表绑定类[原]
  • 原文地址:https://www.cnblogs.com/wangqianyv/p/13365137.html
Copyright © 2011-2022 走看看