Cod sursa(job #1663288)

Utilizator BugirosRobert Bugiros Data 25 martie 2016 19:10:35
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <vector>
using namespace std;

const int MAXN = 10005;

int n,m;

vector<int> vecini[MAXN];

bool vizitat[MAXN];
int st[MAXN], dr[MAXN];

void citire()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    int nrmch;
    scanf("%d%d%d",&n,&m,&nrmch);
    for (int i = 1;i <= nrmch;++i)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        vecini[x].push_back(y);
    }
}

bool cuplare(int x)
{
    if (vizitat[x])
        return false;
    vizitat[x] = true;
    for (unsigned int i = 0;i < vecini[x].size();++i)
    {
        int vecin = vecini[x][i];
        if (st[vecin] == 0)
        {
            dr[x] = vecin;
            st[vecin] = x;
            return true;
        }
    }

    for (unsigned int i = 0;i < vecini[x].size();++i)
    {
        int vecin = vecini[x][i];
        if(cuplare(st[vecin]))
        {
            dr[x] = vecin;
            st[vecin] = x;
            return true;
        }
    }
    return false;
}

int main()
{
    citire();
    bool continuare = true;
    while(continuare)
    {
        continuare = false;
        for (int i = 1;i <= n;++i)
            vizitat[i] = false;
        for (int i = 1;i <= n;++i)
            if (dr[i] == 0)
                continuare = continuare || cuplare(i);
    }
    int nrcuplaj = 0;
    for (int i = 1;i <= n;++i)
        if (dr[i] != 0)
            ++nrcuplaj;
    printf("%d\n", nrcuplaj);
    for (int i = 1;i <= n;++i)
        if (dr[i] != 0)
            printf("%d %d\n",i,dr[i]);
    return 0;
}