Cod sursa(job #1494470)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 1 octombrie 2015 10:16:45
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>

#define DIM 10010

using namespace std;

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

int n, m, e;

vector<int> l[DIM];

int L[DIM], R[DIM];

bool vis[DIM];

bool cupleaza(int node) {

    vis[node] = true;

    for (int i = 0; i < l[node].size(); i++) {

        int child = l[node][i];

        if(!R[child]) {

            L[node] = child;
            R[child] = node;

            return true;

        }

    }

    for (int i = 0; i < l[node].size(); i++) {

        int child = l[node][i];

        if(!vis[R[child]] && cupleaza(R[child])) {

            L[node] = child;
            R[child] = node;

            return true;

        }

    }

    return false;

}

int main () {

    fin >> n >> m >> e;

    for (int i = 1; i <= e; i++) {

        int x, y;

        fin >> x >> y;

        l[x].push_back(y);

    }

    bool ok;

    int cuplaj = 0;

    do {

        ok = false;

        memset(vis, 0, sizeof vis);

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

            if(!L[i] && cupleaza(i)) {

                ok = true;
                cuplaj++;

            }

        }

    }while (ok);

    fout << cuplaj << "\n";

    for (int i = 1; i <= max(n, m); i++)
        if(L[i])
            fout << i << " " << L[i] << "\n";

    return 0;

}