Cod sursa(job #1190122)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 24 mai 2014 16:02:05
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

const int NMax = 10010;
int N, M, E;
vector <int> G[NMax];
int viz[NMax];
int L[NMax], R[NMax];
/// L[i] = vecinul din stanga al lui i
/// R[i] = vecinul din dreapta al lui i

void Read()
{
    ifstream f ("cuplaj.in");
    f >> N >> M >> E;
    for (int i = 1; i <= E; ++ i)
    {
        int x, y; f >> x >> y;
        G[x].push_back(y);
    }
    f.close();
}

inline bool PairUp(const int &Lnode)
{
    if (viz[Lnode])
        return false;
    viz[Lnode] = true;
    for (vector <int> :: iterator it = G[Lnode].begin(); it != G[Lnode].end(); ++ it)
        if (!L[*it])
        {
            L[*it] = Lnode;
            R[Lnode] = *it;
            return true;
        }
    for (vector <int> :: iterator it = G[Lnode].begin(); it != G[Lnode].end(); ++ it)
        if (PairUp(L[*it]))
        {
            L[*it] = Lnode;
            R[Lnode] = *it;
            return true;
        }
    return false;
}


void Solve()
{
    for (bool change = true; change; )
    {
        change = false;
        memset(viz, 0, sizeof(viz));
        for (int i = 1; i <= N; ++ i)
            if (!R[i])
                change |= PairUp(i);
    }
}

void Write()
{
    int ans = 0;
    for (int i = 1; i <= N; ++ i)
        if (R[i])
            ++ans;
    ofstream g("cuplaj.out");
    g << ans << "\n";
    for (int i = 1; i <= N; ++ i)
        if (R[i])
            g << i << " " << R[i] << "\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    Write();
    return 0;
}