Cod sursa(job #1376089)

Utilizator stefantrettTrett Stefan stefantrett Data 5 martie 2015 15:56:13
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <bitset>

#define nMax 10005

using namespace std;
int K, P, M;
bitset<nMax>viz;
vector<int> G[nMax];
int L[nMax], R[nMax];

void read()
{
    scanf("%d %d %d\n", &K, &P, &M);
    int a, b;
    for(int i=1;i<=M;++i)
    {
        scanf("%d %d\n", &a, &b);
        G[a].push_back(b);
    }
}

bool cuplaj(int k)
{
    if(viz[k]) return false;
    viz[k] = 1;

    for(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
        if(!R[*it] || cuplaj(R[*it]))
        {
            L[k] = *it;
            R[*it] = k;
            return true;
        }

    return false;
}

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

    read();

    int ok = 1;
    int nre = 0;

    while(ok)
    {
            ok =0;
            viz = 0;
            for(int i=1;i<=K;++i)
                if(!L[i] && cuplaj(i))
                {
                    nre++;
                    ok = 1;
                }
    }

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

    return 0;
}