Cod sursa(job #2082242)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 5 decembrie 2017 21:08:15
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;
#define ll long long

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

const int N = 10005;
vector <int> edge[N];

int L[N], R[N], used[N];

bool match(int node){
    if(used[node] == true){
        return 0;
    }
    used[node] = true;
    for(auto it : edge[node]){
        if(R[it] == 0){
            L[node] = it;
            R[it] = node;
            return 1;
        }
    }
    for(auto it : edge[node]){
        if(match(R[it])){
            L[node] = it;
            R[it] = node;
            return 1;
        }
    }
    return 0;
}

int main(){
    int n, m, e;
    fin >> n >> m >> e;
    for(int i = 1;i <= e;i++){
        int x, y;
        fin >> x >> y;
        edge[x].push_back(y);
        //edge[y].push_back(x);
    }
    int ans = 0;
    for(bool ok = true;ok;){
        ok = false;
        for(int i = 1;i <= n;i++){
            used[i] = 0;
        }
        for(int i = 1;i <= n;i++){
            if(L[i] == 0){
                if(match(i)){
                    ok = true;
                    ans++;
                }
            }
        }
    }
    fout << ans << '\n';
    for(int i = 1;i <= n;i++){
        if(L[i]){
            fout << i << ' ' << L[i] << '\n';
        }
    }
    return 0;
}