Cod sursa(job #1362785)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 26 februarie 2015 15:28:30
Problema Cuplaj maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

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

const int MAXN = 2 * 10010;

vector <int> Graf[MAXN];
int Mate[MAXN];
bool Viz[MAXN];

bool Match (int nod)
{
    if (Viz[nod])
        return 0;

    Viz[nod] = 1;

    vector <int> :: iterator it;
    for (it = Graf[nod].begin (); it != Graf[nod].end (); ++ it)
        if (!Mate[*it]){
            Mate[*it] = nod;
            Mate[nod] = *it;
            return 1;
        }

    for (it = Graf[nod].begin (); it != Graf[nod].end (); ++ it)
        if (Match (Mate[*it])){
            Mate[*it] = nod;
            Mate[nod] = *it;
            return 1;
        }

    return 0;
}

int main()
{
    int N, M, E, a, b, i;

    in >> N >> M >> E;

    for (i = 1; i <= E; i ++){
        in >> a >> b;

        Graf[a].push_back (b + N);
        //Graf[b + N].push_back (a);
    }

    int change = 1;
    while (change){
        change = 0;

        for (i = 1; i <= N; i ++)
            if (!Mate[i])
                change |= Match (i);

        memset (Viz, 0, sizeof (Viz));
    }

    int Cuplaj = 0;
    for (i = 1; i <= N; i ++)
        if (Mate[i])
            Cuplaj ++;

    out << Cuplaj << "\n";

    for (i = 1; i <= N; i ++)
        if (Mate[i])
            out << i << " " << Mate[i] - N << "\n";

    return 0;
}