Cod sursa(job #3201013)

Utilizator AdrianRosuRosu Adrian Andrei AdrianRosu Data 6 februarie 2024 15:31:18
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>
#define DIM 200001
#define log yhgfrty
#define MOD 1000000007

using namespace std;

ifstream fin("cuplaj.in");

ofstream fout("cuplaj.out");

vector <int> G[DIM];

bool found[DIM];

int v[DIM], x[DIM];

int n, m, Q, a, b, answer, i;

bool can_pair;

bool join(int node){

    found[node] = 1;

    for(auto k : G[node])

        if(!x[k]){

            x[k] = node;

            v[node] = k;

            return true;

        }

    for(auto k : G[node])

        if(!found[x[k]] && join(x[k])){

            x[k] = node;

            v[node] = k;

            return true;

        }

    return false;

}

int main(){

    fin >> n >> m >> Q;

    for(i=1;i<=Q;i++){

        fin >> a >> b;

        G[a].push_back(b);

    }

    can_pair = true;

    while(can_pair){

        can_pair = false;

        std :: fill(found + 1, found + n + 1, 0);

        for(i=1;i<=n;i++)

            if(!v[i])

                can_pair |= join(i);

    }

    for(i=1;i<=n;i++)

        if(v[i])

            answer ++;

    fout << answer << "\n";

    for(i=1;i<=n;i++)

        if(v[i])

            fout << i << " " << v[i] << "\n";

}