Cod sursa(job #2137692)

Utilizator infomaxInfomax infomax Data 20 februarie 2018 23:22:02
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>

using namespace std;

ifstream F("cuplaj.in");
ofstream G("cuplaj.out");

int n, m, k, ans, viz[10005], right_pair[10005], left_pair[10005], ok, x, y;
vector<int> a[10005];

int Match(int nod){
    viz[nod] = 1;
    for(auto it: a[nod]){
        if(!left_pair[it]){
            ans++;
            left_pair[it]=nod;
            right_pair[nod]=it;
            return 1;
        }
    }
    for(auto it: a[nod]){
        if(!viz[left_pair[it]] && Match(left_pair[it])){
            left_pair[it]=nod;
            right_pair[nod]=it;
            return 1;
        }
    }
    return 0;
}

int main()
{
    F >> n >> m >> k;
    for(int i = 1; i <= k; ++ i){
        F >> x >> y;
        a[x].push_back(y);
    }
    ok = 1;
    while(ok){
        ok = 0;
        memset(viz, 0, sizeof(viz));
        for(int i = 1; i <= n; ++ i)
            if(!right_pair[i]&&Match(i)) ok = 1;
    }
    G << ans<<'\n';
    for(int i = 1; i <= n; ++ i)
        if(right_pair[i]) G << i << " " << right_pair[i] << '\n';
    return 0;
}