题面:
给定一个二分图
求最大匹配
思路:
匈牙利算法,DFS版本。O(V*E)
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int N = 3e6;
vector<int>G[N];
int po[N], book[N], ans;//po[v]表示点v当前的匹配对象。
int find(int u){
for(int i = 0; i < G[u].size(); i++){
int v = G[u][i];
if(!book[v]){//不在交替路中
book[v] = 1;//放入交替路
if(po[v]==0||find(po[v])){//当前点未用或最终未用,交替路是增广路。
po[v] = u;//匹配成功
return true;
}
}
}
return false;
}
int main(){
int nl, nr, m;
cin>>nl>>nr>>m;
for(int i = 1; i <= m; i++){
int x, y; cin>>x>>y;
G[y].push_back(x);
}
for(int i = 1; i <= nr; i++){
memset(book,0,sizeof(book));
if(find(i)){
ans++;
}
}
cout<<ans<<"
";
for(int i = 1; i <= nl; i++)cout<<po[i]<<" ";
return 0;
}