Cod sursa(job #2154719)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 7 martie 2018 11:02:07
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <cstdio>
#include <vector>
#include <cstring>
#define Nmax 10003
using namespace std;

FILE *f = fopen("cuplaj.in","r");
ofstream g("cuplaj.out");

int n,R[Nmax],L[Nmax],m,e,nr;
bool uz[Nmax];
vector<int> v[Nmax];

bool cup(int nod){
    uz[nod] = 1;
    for (auto it : v[nod]){
        if (!R[it]){
            L[nod] = it;
            R[it] = nod;
            return 1;
        }
    }
    for (auto it : v[nod]){
        if (!uz[R[it]] && cup(R[it])){
            L[nod] = it;
            R[it] = nod;
        }
    }
    return 0;
}

int main()
{
    fscanf(f,"%d%d%d",&n,&m,&e);

    for (int i=1;i<=e;i++){
        int x,y;
        fscanf(f,"%d%d",&x,&y);
        v[x].push_back(y);
    }

    int ok = 1;
    while (ok){
        ok = 0;
        for (int i=1;i<=n;i++)
            if (!uz[i] && !L[i]) ok |= cup(i);
        memset(uz,0,sizeof(uz));
    }

    for (int i=1;i<=n;i++) if (L[i]) nr++;
    g<<nr<<'\n';
    for (int i=1;i<=n;i++) if (L[i]) g<<i<<' '<<L[i]<<'\n';

    return 0;
}