Cod sursa(job #806777)

Utilizator danalex97Dan H Alexandru danalex97 Data 3 noiembrie 2012 15:15:40
Problema Cuplaj maxim in graf bipartit Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
// Cuplaj in graf bipartit cu liste alternante
// Solutia este un greedy care cupleaza un nod cu
// primul necuplat din cealalta multime si in cazul
// in care nu avem cu cine sa cuplam nodul actual
// vom incerca sa decuplam pe rand fiecare pereche din
// cealalta parte.
// notez ideei despre contor , etc

#include <fstream>
#include <vector>
using namespace std;

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

const int Nmax = 10010;

vector<int> A[Nmax];
int Grad[Nmax];
int L[Nmax],R[Nmax];
int N,M,T,Sol;

typedef vector<int>::iterator IT;

int main()
{
    F>>N>>M>>T;
    for (int i=1,x,y;i<=T;++i)
    {
        F>>x>>y;
        A[x].push_back(y);
        ++Grad[x];
    }

    for (int i=1;i<=N;++i)
    {
        bool Ok = 0;
        for (IT it=A[i].begin();it!=A[i].end() && !Ok;++it)
            if ( R[*it] == 0 )
            {
                Ok = 1;
                L[i] = *it;
                R[*it] = i;
                --Grad[i];
            }
        for (IT it=A[i].begin();it!=A[i].end() && !Ok;++it)
            if ( Grad[R[*it]] > 0 )
            {
                int Nod = R[ *it ];
                for (IT jt=A[Nod].begin();jt!=A[i].end() && !Ok;++jt)
                    if ( R[*jt] == 0 )
                    {
                        Ok = 1;
                        L[Nod] = *jt;
                        R[*jt] = Nod;
                        --Grad[Nod];
                    }
                if ( Ok )
                {
                    L[i] = *it;
                    R[ *it ] = i;
                    ++Grad[Nod];
                    --Grad[i];
                }
            }
        Sol+=Ok;
    }
    G<<Sol<<'\n';
    for (int i=1;i<=N;++i)
        if ( L[i] )
            G<<i<<' '<<L[i]<<'\n';
}