Cod sursa(job #1108626)

Utilizator gabrielvGabriel Vanca gabrielv Data 15 februarie 2014 21:33:01
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

#define NMAX 10010

int L, R, E;
int DieLange;

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

char 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
{
    if(Geabraucht[Knoten])
        return false;

    Geabraucht[Knoten] = 1;

    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(ZuPaar(Linke[*it]))
        {
            Linke[*it] = Knoten;
            Rechts[Knoten] = *it;

            return true;
        }

    return false;
}

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

        memset(Geabraucht, 0, sizeof(Geabraucht));

        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;
}