Cod sursa(job #778232)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 14 august 2012 12:47:20
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <vector>
#include <cstring>

#define MAX 10005

using namespace std;

vector<int> v[MAX];
int l[MAX], r[MAX], u[MAX], n, m, k, a, b;

int pairup(int nod)
{
    if(u[nod]) return 0;
    u[nod] = 1;
    for(int i = 0; i < v[nod].size(); i++)
    {
        if(!r[v[nod][i]])
        {
            l[nod] = v[nod][i];
            r[v[nod][i]] = nod;
            return 1;
        }
    }
    for(int i = 0; i < v[nod].size(); i++)
    {
        if(pairup(r[v[nod][i]]))
        {
            l[nod] = v[nod][i];
            r[v[nod][i]] = nod;
            return 1;
        }
    }
    return 0;
}

int main()
{
    ifstream in("cuplaj.in"); in>>n>>m>>k;
    for(int i = 1; i <= k; i++)
    {
        in>>a>>b;
        v[a].push_back(b);
    } in.close();
    for(int change = 1; change;)
    {
        change = 0;
        memset(u, 0, sizeof(u));
        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++;
    ofstream out("cuplaj.out"); out<<cuplaj<<"\n";
    for(int i = 1; i <= n; i++)
        if(l[i])
            out<<i<<" "<<l[i]<<"\n";
    out.close();
    return 0;
}