Cod sursa(job #2122615)

Utilizator KemyKoTeo Virghi KemyKo Data 5 februarie 2018 12:37:53
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <string.h>
#define NMAX 10001

using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

int n, m, e, nr;
int st[NMAX], dr[NMAX];
bool viz[NMAX];
vector <int> v[NMAX];

bool pair_up(int nod)
{
    int rad, i;

    if(viz[nod])return 0;
    viz[nod]=1;

    for(i=0;i<v[nod].size();++i){
        rad = v[nod][i];
        if(dr[rad]==0){
            st[nod]=rad;
            dr[rad]=nod;
            return 1;
        }
    }

    for(i=0;i<v[nod].size();++i){
        rad = v[nod][i];
        if(pair_up(dr[rad])){
            st[nod]=rad;
            dr[rad]=nod;
            return 1;
        }
    }

    return 0;
}

int main()
{
    int ok=1, i, x, y;

    f>>n>>m>>e;
    for(i=1;i<=e;++i){
        f>>x>>y;
        v[x].push_back(y);
    }

    while(ok){
        memset(viz, 0, n);

        ok=0;

        for(i=1;i<=n;++i)
            if(!st[i])
                ok = ok | pair_up(i);
    }

    for(i=1;i<=n;i++)
        if(st[i]!=0)
            nr++;
    g<<nr<<'\n';
    for(i=1;i<=n;i++)
        if(st[i]!=0)
            g<<i<<' '<<st[i]<<'\n';

    return 0;
}