nyoj 239 月老的難題 二分圖最大匹配(匈牙利算法)

如果對匈牙利算法不太懂的——請猛擊

二分圖最大匹配的第一題,主要是對增廣路的理解,上面博客講的很清楚,不再羅嗦,上代碼——

#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
int n;
vector<int> g[505];   //記錄邊
int mach[505],count;
bool flag[505];  
bool find(int x)
{
	int i;
	for(i=0;i<g[x].size();i++)
	{
		int k=g[x][i];
			if(!flag[k])
			{
				flag[k]=true;  //標記和x已經匹配過的點,避免重複匹配
				if(!mach[k]||find(mach[k]))  //mach[k]不爲0,表示k已經和mach[k]匹配過了,如果能找到增廣路,即find() 爲真,則k可以重新匹配,此時匹配數加1
				{
					mach[k]=x;
					return true;
				}
			}
	}
	return false;
}
int main()
{
	int t,m,a,b,i;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		for(i=1;i<=n;i++)
		  g[i].clear();
		   memset(mach,0,sizeof(mach));
		   count=0;
		while(m--)
		{
			scanf("%d%d",&a,&b);
			g[a].push_back(b);		
		}
		for(i=1;i<=n;i++)
		{
			memset(flag,false,sizeof(flag));//清空標記,上一個i匹配過的點,當前i還可以匹配
			if(find(i))
				count++;
		}
		printf("%d\n",count);
	}
	return 0;}



 

發佈了73 篇原創文章 · 獲贊 18 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章