Cod sursa(job #1908093)

Utilizator Burbon13Burbon13 Burbon13 Data 6 martie 2017 22:39:57
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <vector>
#include <bitset>

using namespace std;

const int nmx = 10002;

int n,m,l;
int d[nmx],s[nmx];
vector <int> g[nmx];
bitset <nmx> viz;

void citire()
{
    scanf("%d %d %d", &n, &m, &l);
    for(int i = 1; i <= l; ++i)
    {
        int nod1,nod2;
        scanf("%d %d", &nod1, &nod2);
        g[nod1].push_back(nod2);
    }
}

bool schimba(int nod)
{
    if(viz[nod])
        return false;
    viz[nod] = true;

    for(vector<int>::iterator it = g[nod].begin(); it != g[nod].end(); ++it)
        if(not d[*it])
        {
            d[*it] = nod;
            s[nod] = *it;
            return true;
        }

    for(vector<int>::iterator it = g[nod].begin(); it != g[nod].end(); ++it)
        if(schimba(d[*it]))
        {
            d[*it] = nod;
            s[nod] = *it;
            return true;
        }

    return false;
}

void crearere()
{
    bool sch = 1;

    while(sch)
    {
        sch = 0;
        viz.reset();
        for(int i = 1; i <= n; ++i)
            if(not s[i])
                sch |= schimba(i);
    }
}

void afish()
{
    int t = 0;
    for(int i = 1; i <= n; ++i)
        if(s[i])
            ++ t;
    printf("%d\n", t);
    for(int i = 1; i <= n; ++i)
        if(s[i])
            printf("%d %d\n", i, s[i]);
}

int main()
{
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);
    citire();
    crearere();
    afish();
    return 0;
}