Cod sursa(job #1108725)

Utilizator gabrielvGabriel Vanca gabrielv Data 16 februarie 2014 02:38:34
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <cstdio>
#include <vector>

using namespace std;

#define NMAX 10010

int L, R, E;
int Tiefe;
int DieLange;

int Linke[NMAX];
int Rechts[NMAX];

int Geabraucht[NMAX];

vector < int > G[NMAX];

void Scannen()
{
    freopen("cuplaj.in", "r", stdin);

    scanf("%d%d%d",&L,&R,&E);

    for(int i=1,x,y;i<=E;i++)
    {
        scanf("%d%d",&x,&y);

        G[x].push_back(y);
    }
}

bool ZuPaar(int Knoten) // Linke Knoten
{
    Geabraucht[Knoten] = Tiefe;

    for(vector < int > :: iterator it = G[Knoten].begin(); it != G[Knoten].end(); ++ it) // Rechts Knoten
        if(!Linke[*it])
        {
            Linke[*it] = Knoten;
            Rechts[Knoten] = *it;

            return true;
        }

    for(vector < int > :: iterator it = G[Knoten].begin(); it != G[Knoten].end(); ++ it) // Rechts Knoten
        if(Geabraucht[Linke[*it]] != Tiefe && ZuPaar(Linke[*it]))
        {
            Linke[*it] = Knoten;
            Rechts[Knoten] = *it;

            return true;
        }

    return false;
}

void Losen()
{
    for(bool Veranderung = true; Veranderung;)
    {
        Veranderung = false;
        Tiefe++;

        for(int i=1;i<=L;i++)
            if(!Rechts[i])
            {
                bool temp = ZuPaar(i);

                if(!Veranderung)
                    Veranderung = temp;
            }
    }
}

void Drucken()
{
    freopen("cuplaj.out", "w", stdout);

    for(int i=1;i<=L;i++)
        if(Rechts[i])
            DieLange++;

    printf("%d\n",DieLange);

    for(int i=1;i<=L;i++)
        if(Rechts[i])
            printf("%d %d\n",i,Rechts[i]);
}

int main()
{
    Scannen();
    Losen();
    Drucken();
    return 0;
}