HDU-1179-Ollivanders(二分图最大匹配)

Posted ydddd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-1179-Ollivanders(二分图最大匹配)相关的知识,希望对你有一定的参考价值。

链接:https://vjudge.net/problem/HDU-1179

题意:

有n个法师和m个魔棒,每个法师喜欢多种魔棒,但每个法师只能在喜欢的魔棒中选一个。

求最多有几个法师能选到魔棒。

思路:

二分图最大匹配,因为题目是魔棒对应的法师,所以输入处理一下。

代码:

#include <iostream>
#include <memory.h>
#include <string>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <algorithm>
#include <map>
#include <queue>
#include <math.h>
#include <cstdio>
#include <set>
#include <iterator>
#include <cstring>
using namespace std;

typedef long long LL;
const int MAXN = 2000+10;
vector<int> G[MAXN];
int Link[MAXN], Vis[MAXN];
int n, m;

void Init()
{
    for (int i = 1;i <= n;i++)
        G[i].clear();
}

bool Dfs(int x)
{
    for (int i = 0;i < G[x].size();i++)
    {
        int node = G[x][i];
        if (Vis[node])
            continue;
        Vis[node] = 1;
        if (Link[node] == -1 || Dfs(Link[node]))
        {
            Link[node] = x;
            return true;
        }
    }
    return false;
}

int Solve()
{
    memset(Link, -1, sizeof(Link));
    int cnt = 0;
    for (int i = 1;i <= n;i++)
    {
        memset(Vis, 0, sizeof(Vis));
        if (Dfs(i))
            cnt++;
    }
    return cnt;
}

int main()
{
    while (cin >> n && n)
    {
        Init();
        cin >> m;
        int num, r;
        for (int i = 1;i <= m;i++)
        {
            cin >> num;
            while (num--)
            {
                cin >> r;
                G[r].push_back(i);
            }
        }
        int cnt = Solve();
        cout << cnt << endl;
    }

    return 0;
}

  

以上是关于HDU-1179-Ollivanders(二分图最大匹配)的主要内容,如果未能解决你的问题,请参考以下文章

HDU——1179 Ollivanders: Makers of Fine Wands since 382 BC.

网络流——二分图最优匹配KM算法

网络流常见建图套路总结(重制版)

HDU 6346 整数规划 二分图匹配最优解

网络流24题小结

[bzoj1614][Usaco2007Jan]Telephone Lines 架设电话线_二分答案_最短路