杭电OJ 1179(C++)

计算二分图最大匹配,套用标准模板即可。

#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 210;

bool vis[MAXN], mp[MAXN][MAXN]; //结点访问数组,各结点之间有无连接
int link[MAXN]; //结点匹配数组
int n, m;

//查找从x出发的增广路径
bool find(int x)
{
    for (int i = n + 1; i <= n + m; i++) //遍历x的邻接点
    {
        if (mp[x][i] && !vis[i]) //x和i之间有对应且i未被访问
        {
            vis[i] = true;
            //i未匹配或者从i的匹配点出发能找到增广路径
            if (link[i] == -1 || find(link[i]))
            {
                link[i] = x;
                return true;
            }
        }
    }
    return false;
}

int main()
{
    while (cin >> n >> m)
    {
        memset(link, -1, sizeof(link));
        memset(mp, false, sizeof(mp));
        for (int i = 1; i <= m; i++)
        {
            int a, b;
            cin >> a;
            while (a--)
            {
                cin >> b;
                mp[i][m + b] = true;
            }
        }
        int ans = 0;
        for (int i = 1; i <= m; i++)
        {
            memset(vis, false, sizeof(vis));
            if (find(i))
                ++ans;
        }
        cout << ans << endl;
    }
    return 0;
}

继续加油。

发布了138 篇原创文章 · 获赞 1 · 访问量 7020

猜你喜欢

转载自blog.csdn.net/Intelligence1028/article/details/104563722