二分图最大匹配

来源:互联网 发布:网络照片女生头像大全 编辑:程序博客网 时间: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;}

原创粉丝点击