短小精悍的一个算法,提出者是匈牙利著名数学家Edmonds.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
#include <cstdio> #include <cstring>
using namespace std; const int maxn=1010; bool flag[maxn][maxn],vis[maxn]; int match[maxn]; int m,n,e,ans; inline bool (int cur){ for(int i=1;i<=m;i++){ if(flag[cur][i] && !vis[i]){ vis[i]=1; if(!match[i] || dfs(match[i])){ match[i]=cur; return 1; } } } return 0; } int main(){ scanf("%d%d%d",&n,&m,&e); for(int i=1;i<=e;i++){ int a,b; scanf("%d%d",&a,&b); if(a<=n && b<=m) flag[a][b]=true; } for(int i=1;i<=n;i++){ memset(vis,false,sizeof(vis)); if(dfs(i)) ans++; } printf("%dn",ans); return 0; }
|
近期评论