Cod sursa(job #2834657)

Utilizator Andreea__Zavoiu Andreea Andreea__ Data 17 ianuarie 2022 14:01:58
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>
#include <vector>
#define Nmax 100001
using namespace std;

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

int n, m, e, viz[Nmax], l[Nmax], r[Nmax], sol;
vector<int> la[Nmax];

int cuplaj(int x)
{
    if(viz[x])
        return 0;
    viz[x] = 1;
    for(auto y : la[x]){
        if(r[y])
            continue;
        l[x] = y;
        r[y] = x;
        ++ sol;
        return 1;
    }
    for(auto y : la[x]){
        if(cuplaj(r[y])){
            l[x] = y;
            r[y] = x;
            return 1;
        }
    }
    return 0;
}

int main()
{
    int a, b;
    fin >> n >> m >> e;
    for(int i = 1; i <= e; ++ i){
        fin >> a >> b;
        la[a].push_back(b);
    }

    while(true){
        fill(viz, viz + 1 + n, 0);
        int r = 0;
        for(int i = 1; i <= n; ++ i)
            if(!l[i])
                r += cuplaj(i);
        if(!r){
            break;
        }
    }

    fout << sol << '\n';
    for(int i = 1; i <= m; ++ i){
        if(r[i]){
            fout << r[i] << ' ' << i << '\n';
        }
    }

    return 0;
}