如果對匈牙利算法不太懂的——請猛擊
二分圖最大匹配的第一題,主要是對增廣路的理解,上面博客講的很清楚,不再羅嗦,上代碼——
#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;}