Cod sursa(job #2216599)

Utilizator Constantin.Dragancea Constantin Constantin. Data 27 iunie 2018 14:21:35
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>
using namespace std;

const int N = 10010;
int n, m, e, l[N], r[N], ans;
vector <int> v[N];
bool viz[N];

bool dfs(int q){
    //cout << q << " ";
    if (viz[q]) return 0;
    viz[q] = 1;
    for (auto it: v[q]){
        if (!r[it] || dfs(r[it])){ // verifica daca nu mai poate foace alte legaturi
            l[q] = it;
            r[it] = q;
            return 1;
        }
    }
    return 0;
}

int main(){
    ifstream cin ("cuplaj.in");
    ofstream cout ("cuplaj.out");
    cin >> n >> m >> e;
    for (int i=1, x, y; i<=e; i++){
        cin >> x >> y;
        v[x].push_back(y);
    }
    bool flag = 1;
    while (flag){
        flag = 0;
        for (int i=1; i<=n; i++) viz[i] = 0;
        for (int i=1; i<=n; i++){
            if (!l[i] && dfs(i)){
                flag = 1;
                ans++;
            }
            //cout << "\n";
        }

        //for (int i=1; i<=n; i++) cout << l[i] << " ";
        //cout << "\n";
        //for (int i=1; i<=m; i++) cout << r[i] << " ";
        //cout << "\n\n";
    }
    cout << ans << "\n";
    for (int i=1; i<=n; i++)
        if (l[i]) cout << i << " " << l[i] << "\n";
    return 0;
}