二分图最大匹配
来源:互联网 发布:网络照片女生头像大全 编辑:程序博客网 时间:2024/05/01 17:23
#include<iostream>using namespace std;const int maxn = 201;int g[maxn][maxn];int link[maxn];int vis[maxn];int n, m;/*dfs 找增广路径*/bool dfs(int u){ for(int v=1; v<=m; v++) { if(g[u][v] && !vis[v]) { vis[v] = 1; if( !link[v] || dfs(link[v]) )/*dfs(link[v]是算法的核心部分,用来找增光路*/ { link[v] = u; return true; } } } return false;}/*最大匹配算法*/int maxMatch(){ int ret = 0; memset(link, 0, sizeof(link)); for(int i=1; i<=n; i++) { memset(vis, 0, sizeof(vis));/*X 集合的一个顶点找到匹配边后, 在下一个顶点找时要从新设置vis[i]为false*/ if(dfs(i)) ret += 1; } return ret;}int main(){ int edge_num, to; while(scanf("%d%d", &n, &m)!=EOF) { memset(g,0, sizeof(g)); for(int i=1; i<=n; i++) { scanf("%d", &edge_num); for(int j=0; j<edge_num; j++) { scanf("%d", &to); g[i][to] = 1; } } int ret = maxMatch(); printf("%d/n", ret); } return 0;}