Cod sursa(job #1914281)

Utilizator dragomirmanuelDragomir Manuel dragomirmanuel Data 8 martie 2017 16:17:47
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>

#define pb push_back

using namespace std;

const int NMax = 10005;

int N, M, E;
int viz[NMax], Left[NMax], Right[NMax];

vector < int > G[NMax];

void Read()
{
    scanf("%d %d %d\n", &N, &M, &E);

    for(int i=1; i<=E; ++i)
    {
        int x,y;
        scanf("%d %d", &x, &y);
        G[x].pb(y);
    }
}

int cuplaj(int x)
{
    if(viz[x])
        return 0;

    viz[x]=1;

    vector < int > ::iterator it;

    for(it=G[x].begin(); it!=G[x].end(); ++it)
        if(!Right[*it])
        {
            Left[x] = *it;
            Right[*it] = x;
            return 1;
        }

    for(it=G[x].begin(); it!=G[x].end(); ++it)
        if(cuplaj(Right[*it]))
        {
            Left[x] = *it;
            Right[*it] = x;
            return 1;
        }

    return 0;
}

int main()
{
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);

    Read();
    int OK=1;

    while(OK)
    {
        memset(viz, 0, sizeof(viz));
        OK=0;

        for(int i=1; i<=N; ++i)
            if(!Left[i])
                OK += cuplaj(i);
    }

    int nr=0;

    for(int i=1; i<=N; ++i)
        if(Left[i])
            ++nr;

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

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

    return 0;
}