Cod sursa(job #2699511)

Utilizator codustef122Smeu Stefan codustef122 Data 24 ianuarie 2021 19:16:06
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <vector>
#include<cstring>
using namespace std;

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

const int nMax = 10005;
int u, v, N, M, E, rez, viz[nMax], l[nMax], r[nMax];
vector<int> adj[nMax];


bool cuplaj(int x)
{
    if (viz[x])
        return false;
    viz[x] = 1;
    for (vector<int>::iterator it = adj[x].begin(); it!=adj[x].end(); ++it  )
        if (r[*it] == 0 || cuplaj(r[*it]))
        {
            l[x] = *it;
            r[*it] = x;
            return true;
        }
    return false;
}

int main()
{
    //read
    fin >> N >> M >> E;
    for (int i = 0; i < E; i++) {
        fin >> u >> v;
        adj[u].push_back(v);
    }

    //main
    bool truth = true;
    while (truth) {
        truth = false;
        memset(viz, 0, sizeof(viz));
        for (int i = 1; i <= N; ++i)
            if (l[i] == 0 && cuplaj(i))
            {
                ++rez;
                truth = true;
            }
    }

    //print
    fout << rez << '\n';
    for (int i = 1; i <= N; ++i)
        if (l[i])
            fout << i << " " << l[i] << '\n';



    return 0;
}