码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-05-15 15:54:30      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:const   false   memory   math   map   最大匹配   math.h   https   iter   

链接: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(二分图最大匹配)

标签:const   false   memory   math   map   最大匹配   math.h   https   iter   

原文地址:https://www.cnblogs.com/YDDDD/p/10869598.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!