Cod sursa(job #1502227)

Utilizator MaarcellKurt Godel Maarcell Data 14 octombrie 2015 13:23:51
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;

int N,M,E,l[10100],r[10100]; vector<int> g[10100];
bool v[10100];

bool try_match(int nod){
    if (v[nod]) return 0;
    v[nod]=1;

    int i,nd;
    for (i=0; i<g[nod].size(); i++){
        nd=g[nod][i];
        if (!r[nd] || try_match(r[nd])){
            l[nod]=nd;
            r[nd]=nod;
            return 1;
        }
    }

    return 0;
}

int main(){
    ifstream fin("cuplaj.in");
    ofstream fout("cuplaj.out");
    fin >> N >> M >> E;

    int i,x,y;
    for (i=1; i<=E; i++){
        fin >> x >> y;
        g[x].push_back(y);
    }

    bool ex=1;
    while (ex){
        ex=0;
        memset(v,0,sizeof(v));
        for (i=1; i<=N; i++)
            if (!l[i])
                ex|=try_match(i);
    }

    int cnt=0;
    for (i=1; i<=N; i++)
        if (l[i]) cnt++;

    fout << cnt << "\n";
    for (i=1; i<=N; i++)
        if (l[i]) fout << i << " " << l[i] << "\n";

    return 0;
}