/****************************************************
> File Name: hungry.cpp
> Author: Yuji CAO
> Mail: 1007171627@qq.com
> Created Time: 日 6/11 18:29:58 2017
*****************************************************/
#include<map>
#include<vector>
#include<unordered_set>
#include<unordered_map>
#include<list>
#include<queue>
#include<deque>
#include<stack>
#include<iostream>
#include<set>
using namespace std;
bool rematch_for_node(vector<vector<int> >& link_left_2_right, int left, vector<int>& match, unordered_set<int>& visited) {
for (int j : link_left_2_right[left]) {
if (visited.count(j) != 0) continue;
if (match[j] != -1) {
visited.insert(j);
bool rematch = rematch_for_node(link_left_2_right, match[j], match, visited);
if (rematch) {
match[j] = left;
return true;
}
} else {
match[j] = left;
return true;
}
}
return false;
}
int max_match(vector<vector<int> >& link_left_2_right, int m, vector<int>& match) {
int res = 0;
match.resize(m, -1);
for (int i = 0; i < link_left_2_right.size(); ++i) {
unordered_set<int> visited;
bool tmp = rematch_for_node(link_left_2_right, i, match, visited);
if (tmp) res++;
}
return res;
}
int main() {
int n,m;
cin>>n>>m;
int n_edge = 0;
cin>>n_edge;
vector<vector<int> > link_left_2_right(n, vector<int>());
for (int i = 1; i <= n_edge; ++i) {
int l, r;
cin>>l>>r;
link_left_2_right[l].push_back(r);
}
vector<int> match;
int ans = max_match(link_left_2_right, m, match);
cout<<"answer:\t"<<ans<<endl;
for (int i = 0; i < match.size(); ++i) {
cout<<i<<"\t"<<match[i]<<endl;
}
return 0;
}
深度优先搜索版的匈牙利算法
最新推荐文章于 2024-03-01 10:51:33 发布