1. 程式人生 > >洛谷 3386 二分圖匹配模板 匈牙利演算法

洛谷 3386 二分圖匹配模板 匈牙利演算法

模板

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=2000001;
int fst[MAXN],nxt[MAXN],ss[MAXN];
bool vis[MAXN];
int n,m,e,tot,cnt;
struct hh
{
    int from,to;
}ma[MAXN];
void build(int f,int t)
{
    tot++;
    ma[tot]=(hh){f,t};
    nxt[tot]=fst[f];
    fst[f]=tot;
    return
; } bool dfs(int x) { for(int i=fst[x];i;i=nxt[i]) { int v=ma[i].to; if(!vis[v]) { vis[v]=1; if(!ss[v] || dfs(ss[v])) { ss[v]=x; return true; } } } return false; } void solve() { scanf
("%d%d%d",&n,&m,&e); for(int i=1;i<=e;i++) { int x,y; scanf("%d%d",&x,&y); if(x>n || y>m) continue; build(x,y); } for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) cnt++; } cout<<cnt; } int
main() { solve(); return 0; }