Cod sursa(job #1844045)

Utilizator alexandru822Bosinta Alexandru alexandru822 Data 9 ianuarie 2017 17:46:32
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <vector>
#include <string.h>
using namespace std;

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

const int N_MAX = 10000;

vector<int> vecini[1 + N_MAX];
int l[1 + N_MAX];
int r[1 + N_MAX];
bool vizitat[1 + N_MAX];

bool pairup(int i)
{
    if(vizitat[i]) return 0;
    vizitat[i] = 1;
    for(int m : vecini[i])
        if(!r[m])
        {
            l[i] = m;
            r[m] = i;
            return 1;
        }
    for(int m : vecini[i])
        if(pairup(r[m]))
        {
            l[i] = m;
            r[m] = i;
            return 1;
        }
    return 0;
}

int main()
{
    int N, M, E;
    in >> N >> M >> E;
    for(int i = 1; i <= E;i++)
    {
        int u, v;
        in >> u >> v;
        vecini[u].push_back(v);
    }
    for(bool change = 1; change;)
    {
        change = 0;
        memset(vizitat, 0, sizeof(vizitat));
        for(int i = 1; i <= N; i++) if(!l[i]) change |= pairup(i);
    }
    int cuplaj = 0;
    for(int i = 1; i <= N; i++) if(l[i]) cuplaj ++;
    out << cuplaj << "\n";
    for(int i = 1; i <= N; i++) if(l[i]) out << i << " " << l[i] << "\n";
    return 0;
}