Cod sursa(job #1625236)

Utilizator iulianbuteBute Iulian iulianbute Data 2 martie 2016 17:41:04
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 3.18 kb
#include <iostream>
#include <fstream>

#define MAX_NODURI 10000
#define MAX_MUCHII 10000


using namespace std;

int nrNoduri, nrNoduriA, nrNoduriB, nrMuchii;
int nrVeciniNod[MAX_NODURI];
int veciniNod[MAX_NODURI][MAX_MUCHII];
int nrVeciniStg;
int esteCuplat[MAX_NODURI];
int nodVizitat[MAX_NODURI];

int cuplajMaximal()
{
    int nodCurent=1, nodUrmator=1;
    while (nodCurent<=nrNoduri)
    {
        if (esteCuplat[nodCurent]==-1)
        {
            for (int nodVecinUrmator=0; nodVecinUrmator<nrVeciniNod[nodCurent]; nodVecinUrmator++)
            {
                nodUrmator=veciniNod[nodCurent][nodVecinUrmator];
                if (esteCuplat[nodUrmator]==-1 && esteCuplat[nodCurent]==-1 )
                {
                    esteCuplat[nodCurent]=nodUrmator;
                    esteCuplat[nodUrmator]=nodCurent;
                    nodVecinUrmator=nrVeciniNod[nodCurent];
                    nrVeciniStg++;
                }
            }
        }
        nodCurent++;
    }
    return 0;
}

int dfs(int nodCurent)
{
    nodVizitat[nodCurent]=1;
    for(int indexNodUrmator=0; indexNodUrmator<nrVeciniNod[nodCurent]; ++indexNodUrmator)
    {
        int nodUrmator;
        nodUrmator=veciniNod[nodCurent][indexNodUrmator];
        if(nodVizitat[nodUrmator] || esteCuplat[nodCurent]==nodUrmator) continue;
        if(esteCuplat[nodUrmator]==-1)
        {
            nodVizitat[nodUrmator]=-1;
            esteCuplat[nodCurent]=nodUrmator;
            esteCuplat[nodUrmator]=nodCurent;
            nrVeciniStg++;
            return 1;
        }
            else
            {
                nodVizitat[nodUrmator]=nodCurent;
                if(dfs(esteCuplat[nodUrmator]))
                {
                    esteCuplat[nodCurent]=nodUrmator;
                    esteCuplat[nodUrmator]=nodCurent;
                    return 1;
                }
                    else continue;
            }
    }
    return 0;
}

int afis()
{
    ofstream out;
    out.open("cuplaj.out");
    out<<nrVeciniStg<<endl;
    for(int nodCurent=1; nodCurent<=nrNoduriA; nodCurent++)
        if(esteCuplat[nodCurent]!=-1) out<<nodCurent<<" "<<esteCuplat[nodCurent]-nrNoduriA<<endl;
//    out<<endl;
    out.close();
    return 0;
}

int main()
{
    ifstream in;
    in.open("cuplaj.in");
    in>>nrNoduriA>>nrNoduriB>>nrMuchii;
    nrNoduri=nrNoduriA+nrNoduriB;
    for(int nodCurent=1; nodCurent<=nrNoduri; nodCurent++) esteCuplat[nodCurent]=-1;

    int nod1, nod2;
    while (!in.eof())
    {
        in>>nod1>>nod2; nod2+=nrNoduriA;
        veciniNod[nod1][nrVeciniNod[nod1]]=nod2; nrVeciniNod[nod1]++;
        veciniNod[nod2][nrVeciniNod[nod2]]=nod1; nrVeciniNod[nod2]++;

    }
    in.close();

    cuplajMaximal();

//    cout<<"cuplaj maximal:"<<endl;
//    afis();

    int ok=1;
    while(ok)
    {
        ok=0;
        for(int nodCurent=1; nodCurent<=nrNoduri; nodCurent++) nodVizitat[nodCurent]=0;
        for(int nodCurent=1; nodCurent<=nrNoduriA; nodCurent++)
            if(!nodVizitat[nodCurent] && esteCuplat[nodCurent]==-1) ok=dfs(nodCurent);
    }

//    cout<<"cuplaj maxim:"<<endl;
    afis();

    return 0;
 }