Cod sursa(job #263225)

Utilizator ProtomanAndrei Purice Protoman Data 20 februarie 2009 00:00:23
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <vector>

#define pb push_back
#define mp make_pair
#define f first
#define s second
#define MAX 10010

using namespace std;

int testCases, nrSour, nrDest, nrEdges;
int vctDr[MAX], vctSt[MAX], sel[MAX];
vector <pair <int, int> > vctDrum;
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(listDrum[nod][i]))
        {
            vctSt[listDrum[nod][i]] = nod;
            vctDr[nod] = listDrum[nod][i];

            return 1;
        }

    return 0;
}

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

    for (scanf("%d", &testCases), testCases = 1; testCases;
        memset(vctDr, 0, sizeof(vctDr)), memset(vctSt, 0, sizeof(vctSt)), testCases--)
    {
        scanf("%d %d %d", &nrSour, &nrDest, &nrEdges);

        vctDrum.erase(vctDrum.begin(), vctDrum.end());
        for (int i = 0; i < nrEdges; i++)
        {
            int t, f;
            scanf("%d %d", &t, &f);

            vctDrum.pb(mp(t, f));
        }

        sort(vctDrum.begin(), vctDrum.end());

        listDrum[vctDrum[0].f].pb(vctDrum[0].s);
        for (int i = 0; i < nrEdges; i++)
            if (vctDrum[i] != vctDrum[i - 1])
                listDrum[vctDrum[i].f].pb(vctDrum[i].s);

        for (int ok = 1, i; ok; memset(sel, 0, sizeof(sel)))
            for (i = 1, ok = 0; i <= nrSour; i++)
                if (!vctDr[i])
                    ok |= cupleaza(i);

        int sol = 0;
        for (int i = 1; i <= nrSour; i++)
        {
            listDrum[i].erase(listDrum[i].begin(), listDrum[i].end());

            if (vctDr[i])
                sol++;
        }

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

    }

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