Cod sursa(job #263124)

Utilizator ProtomanAndrei Purice Protoman Data 19 februarie 2009 22:18:57
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <string.h>

#define pb push_back
#define MAX 10010

using namespace std;

int nrSour, nrDest, nrEdges, sol;
int vctDr[MAX], vctSt[MAX], sel[MAX];
vector <int> listDrum[MAX];

int cupleaza(int nod)
{
    if (sel[nod])
        return 0;

    sel[nod] = 1;

    for (int i = 0; i < listDrum[nod].size(); i++)
        if (!vctSt[listDrum[nod][i]] || cupleaza(vctSt[listDrum[nod][i]]))
        {
            vctSt[listDrum[nod][i]] = nod;
            vctDr[nod] = listDrum[nod][i];

            return 1;
        }

    return 0;
}


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

    scanf("%d %d %d", &nrSour, &nrDest, &nrEdges);

    for (; nrEdges; nrEdges--)
    {
        int t, f;
        scanf("%d %d", &t, &f);

        listDrum[t].pb(f);
    }

    for (int i = 1; i <= nrSour; i++)
    {
        if (vctDr[i])
            continue;

        memset(sel, 0, sizeof(sel));
        sol += cupleaza(i);
    }

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

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

    fclose(stdin);
    fclose(stdout);
    return 0;
}