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(二分图最大匹配)的主要内容,如果未能解决你的问题,请参考以下文章