二分匹配

来源:互联网 发布:游戏优化器 编辑:程序博客网 时间:2024/04/30 21:32
#include <stdio.h>#include <string.h>const int maxv = 505;const int maxe = 1005;int k, n, m;int l= 0;int head[maxv];int linker[maxv];bool vis[maxv];struct eage{int v;//int w;int next;}e[maxe];void init(){memset(head,-1,sizeof(head));l = 0;}void add(int u, int v){e[l].v = v;e[l].next = head[u];head[u] = l;l ++;}/*bool bfs0(int u){for(int v=1; v<=m ;v++){if(g[u][v] && vis[v] == false){vis[v] = true;if(linker[v] == -1 || bfs(linker[v])){linker[v] = u;return true;}//}}return false;}*/bool bfs(int u){for(int i = head[u]; i!=-1; i = e[i].next){int v = e[i].v;if(vis[v] == false){vis[v] = true;if(linker[v] == -1 || bfs(linker[v])){linker[v] = u;return true;}}}return false;}void solve(){int ans = 0;memset(linker, -1, sizeof(linker));for(int i=1; i<=m; i++){memset(vis, false, sizeof(vis));if(bfs(i))ans ++;}printf("%d\n", ans);}int main(){while(scanf("%d", &k), k){scanf("%d%d", &m, &n);init();while(k --){int a, b;scanf("%d%d", &a, &b);add(a, b);}solve();}}