Cod sursa(job #1403291)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 27 martie 2015 10:37:22
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<iostream>
#include<fstream>
#include<cmath>
#include<vector>
#include<cstring>

using namespace std;

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

vector <int> G[10005];
int l[10005], r[10005], use[10005];
int n, m, e, cup;

void citire()
{
    int i,x,y;
    f>>n>>m>>e;
    for(i=1; i<=e; i++){
        f>>x>>y;
        G[x].push_back(y);
    }
}

int pairup(int nod)
{
    int vecin,i;

    if(use[nod])
        return 0;

    use[nod] = 1;

    for(i=0; i<G[nod].size(); i++){
        vecin = G[nod][i];
        if(r[vecin]==0){
            r[vecin] = nod;
            l[nod] = vecin;
            return 1;
        }
    }

    for(i=0; i<G[nod].size(); i++){
        vecin = G[nod][i];
        if(pairup(r[vecin])){
            l[nod] = vecin;
            r[vecin] = nod;
            return 1;
        }
    }

    return 0;
}

int main()
{
    citire();

    int ok,i;
    ok=1;
    while(ok)
    {
        ok=0;

        for(i=1;i<=n;i++)
            use[i] = 0;

        for(i=1; i<=n; i++)
            if(l[i]==0)
                if(pairup(i)){
                    ok=1;
                    cup++;
            }
    }

    g<<cup<<"\n";

    for(i=1; i<=n; i++)
        if(l[i]){
            g<<i<<" "<<l[i]<<"\n";}

    return 0;
}