Cod sursa(job #1697669)

Utilizator diana97Diana Ghinea diana97 Data 2 mai 2016 17:30:46
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

ifstream f ("cuplaj.in");
ofstream g ("cuplaj.out");

const int NMAX = 10000 + 1;

int n, m, e;
vector <int> graf[NMAX];

int a[NMAX], b[NMAX];
bool vizitat[NMAX];

void citeste() {
    f >> n >> m >> e;
    int a, b;
    for (int i = 1; i <= e; i++) {
        f >> a >> b;
        graf[a].push_back(b);
    }
}


bool cupleaza(int nod) {
    if (vizitat[nod] == true) return false;
    vizitat[nod] = true;

    int l, fiu;


    l = graf[nod].size();
    for (int i = 0; i < l; i++) {
        fiu = graf[nod][i];
        if (!a[fiu]) {
            a[fiu] = nod;
            b[nod] = fiu;
            return true;
        }
    }

    for (int i = 0; i < l; i++) {
        fiu = graf[nod][i];
        if (cupleaza(a[fiu])) {
            a[fiu] = nod;
            b[nod] = fiu;
            return true;
        }
    }

    return false;
}

void rezolva() {
    bool done = false;

    while(!done) {
        done = true;
        for (int i = 1; i <= n; i++) vizitat[i] = false;
        for (int i = 1; i <= n; i++)
            if (!b[i])
                if (cupleaza(i)) done = false;
    }
}

void scrie() {
    int muchii_cuplaj = 0;
    for (int i = 1; i <= n; i++)
        muchii_cuplaj += (b[i] != 0);
    g << muchii_cuplaj << '\n';
    for (int i = 1; i <= n; i++)
        if (b[i]) g << i << ' ' << b[i] << '\n';
}

int main() {
    citeste();
    rezolva();
    scrie();

    return 0;
}