Cod sursa(job #1817789)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 28 noiembrie 2016 14:49:18
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <cstring>
#include <iomanip>
#include <climits>
#include <fstream>
#include <vector>
#include <algorithm>
#define NMAX 10005

using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

vector<int> v[NMAX];
int st[NMAX], dr[NMAX];
bool viz[NMAX];

bool cupleaza(int x) {
    if(viz[x]) return 0;
    viz[x]=1;

    for(auto it:v[x]) {
        if(st[it]==0) {
            st[it]=x;
            dr[x]=it;
            return 1;
        }
    }

    for(auto it:v[x]) {
        if(cupleaza(it)) {
            st[it]=x;
            dr[x]=it;
            return 1;
        }
    }

    return 0;
}

int main(){
    int n,m,e,i,x,y,total=0;

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

    int ok=1;
    while(ok) {
        ok=0;
        memset(viz,0,sizeof(viz));
        for(i=1;i<=n;++i)
            if(dr[i]==0)
                ok|=cupleaza(i);
    }

    for(i=1;i<=n;++i) if(dr[i]) ++total;

    fout<<total<<'\n';
    for(i=1;i<=n;++i) if(dr[i]) fout<<i<<' '<<dr[i]<<'\n';

    return 0;
}