Artifact de8fb2bb9f6a1b6db919912d3742787fd8270ab1
//-------------------------------------------------------------
// Bipertite max-matching (by duality, min-vert-cover)
// O(V E)
//
// Verified by
// SRM 397 Div1 Lv3
//-------------------------------------------------------------
typedef int vert;
typedef vert edge;
typedef vector<edge> edges;
typedef vector<edges> graph;
bool augment( graph& G, int v, vector<vert>& matchTo, bool visited[] )
{
for(int i=0; i<G[v].size(); ++i) {
vert u = G[v][i];
if( visited[u] ) continue;
visited[u] = true;
if( matchTo[u]<0 || augment(G, matchTo[u], matchTo, visited) )
{ matchTo[v]=u, matchTo[u]=v; return true; }
}
return false;
}
template<int NV>
int biMatch( graph& G, int L ) // [0,L):left, [L,?):right
// only left->right edges are used during computation
{
vector<vert> matchTo(G.size(), -1);
int ans = 0;
for(vert v=0; v<L; ++v) {
bool visited[NV] = {};
if( augment(G, v, matchTo, visited) )
++ans;
}
return ans;
}