洛谷P1894 完美的牛栏 题解 二分图最大匹配模板题

题目链接:https://www.luogu.com.cn/problem/P1894

题目大意:求二分图最大匹配。

解题思路:hungary算法。

实现代码如下:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 220;
int n, m, linky[maxn];
bool vis[maxn];
vector<int> g[maxn];
bool dfs(int u) {
    int sz = g[u].size();
    for (int i = 0; i < sz; i ++) {
        int v = g[u][i];
        if (vis[v]) continue;
        vis[v] = true;
        if (!linky[v] || dfs(linky[v])) {
            linky[v] = u;
            return true;
        }
    }
    return false;
}
int hungry() {
    int cnt = 0;
    for (int i = 1; i <= n; i ++) {
        memset(vis+1, false, sizeof(bool)*m);
        if (dfs(i)) cnt ++;
    }
    return cnt;
}
int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i ++) {
        int c, a;
        cin >> c;
        while (c --) {
            cin >> a;
            g[i].push_back(a);
        }
    }
    cout << hungry() << endl;
    return 0;
}
posted @ 2020-02-16 21:16  quanjun  阅读(100)  评论(0编辑  收藏  举报