Cod sursa(job #1629870)

Utilizator maribMarilena Bescuca marib Data 4 martie 2016 19:34:16
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#define DMAX 10005
#include <vector>
using namespace std;

vector <int> edges[DMAX];

int l_match[DMAX], vis[DMAX], r_match[DMAX];

int l, r, m, temp, a, b, sol;

int cupleaza(int varf){
    int vecin;
    if(vis[varf]) return false;
    vis[varf] = 1;
    for(int j = 0; j < edges[varf].size(); ++j){
        vecin = edges[varf][j];
        if(!l_match[vecin]){
            r_match[varf] = vecin;
            l_match[vecin] = varf;
            return true;
        }
    }
    for(int j = 0; j < edges[varf].size(); ++j){
        vecin = edges[varf][j];
        if(cupleaza(l_match[vecin])){
            r_match[varf] = vecin;
            l_match[vecin] = varf;
            return true;
        }
    }
    return false;
}

int main()
{
    ifstream in("cuplaj.in");
    ofstream out("cuplaj.out");
    in>>l>>r>>m;
    while(m--){
        in>>a>>b;
        edges[a].push_back(b);
    }
    temp = 1;
    while(temp){
        for(int i = 1; i <= l; ++i)
            vis[i] = 0;
        temp = 0;
        for(int i = 1; i <= l; ++i){
            if(!r_match[i] && cupleaza(i)){
                sol++; temp = 1;
            }
        }
    }
    out<<sol<<"\n";
    for(int i = 1; i <= l; ++i){
        if(r_match[i])
            out<<i<<" "<<r_match[i]<<"\n";
    }
    in.close();
    out.close();
    return 0;
}