1. 程式人生 > >二分匹配 (匈牙利演算法及模板)

二分匹配 (匈牙利演算法及模板)

   二分匹配我認為其實就是m個女生,n個男生相互認識的在一起,求最大匹配成的對數。

   二分匹配的時間複雜度是O(NM)

相關概念:

最大匹配數:最大匹配的匹配邊的數目

  • 定理1:最大匹配數 = 最小點覆蓋數(這是 Konig 定理)
  • 定理2:最大獨立集 = 頂點數 - 最小點覆蓋數
  • 定理3:最小路徑覆蓋數 = 頂點數 - 最大匹配數

最大完全數:圖中最大完全子圖的頂點個數。

獨立集:圖中任意兩個頂點都不相連的頂點集合。

獨立數:獨立集中頂點的個數  

完全子圖:任意兩點都相連的頂點的集合 

最大完全數(最大團)=原圖的補圖的最大獨立數 

模板:

#include<stdio.h>
#include<string.h>
int map[110][110],book[110],match[110];
int n,m;
int dfs(int u)
{
	int i;
	for(i=1;i<=n;i++)
	{
		if(book[i]==0&&map[u][i]==1)
		{
			book[i]=1;
			if(match[i]==0||dfs(match[i]))
			{
				match[i]=u;
				return 1;
			}
		}
	}
	return 0;
}
int main()
{
	int i,sum,a,b;
	sum=0;
	memset(map,0,sizeof(map));
	memset(match,0,sizeof(match));
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&a,&b);
		map[a][b]=1;
	}	
	for(i=1;i<=n;i++)
	{
		memset(book,0,sizeof(book));
		if(dfs(i))
			sum++;
	}
	printf("%d\n",sum);
	return 0;
} 

KM演算法:

            KM演算法詳解+模板