题目链接:HDU - 2063
匈牙利算法模板。
大概过程就是对一个点进行匹配时,尝试匹配所有与它相连的点。如果这个点没有被匹配,或者这个点被匹配了,但是匹配它的点可以重新找到一个匹配点,从而腾出这个点,那么就可以与这个点匹配。
used数组标记遍历到的v。如果不标记,增广过程中一个点会重复匹配v。
最大匹配就是对一边所有的点尝试匹配,看有多少成功匹配的。
代码:
#include<stdio.h> #include<string.h> #include<algorithm> #include<vector> using namespace std; typedef long long ll; #define inf 0x3f3f3f3f #define MAXN 510 int k,n,m; int match[MAXN]; bool used[MAXN]; vector<int> G[MAXN]; bool find(int u) { for(int i=0;i<G[u].size();i++) { int v=G[u][i]; if(!used[v]) { used[v]=1; if(!match[v] || find(match[v])) { match[v]=u; return true; } } } return false; } void init() { memset(match,0,sizeof match); for(int i=1;i<=n;i++) G[i].clear(); } int solve() { int ans=0; for(int i=1;i<=n;i++) { memset(used,0,sizeof used); if(find(i)) ans++; } return ans; } int main() { while(~scanf("%d",&k) && k) { scanf("%d%d",&n,&m); init(); for(int i=0;i<k;i++) { int u,v; scanf("%d%d",&u,&v); G[u].push_back(v); } printf("%d\n",solve()); } return 0; }