Cod sursa(job #1137225)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 9 martie 2014 12:20:41
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<fstream>
#include<vector>
 #include <cstring>
using namespace std;

int N,M,nrmuchii,stang[10005],u[10005],drept[10005],cuplaj;
vector <int> v[10005];


void citire() {

    ifstream in("cuplaj.in");
    int i,x,y;
    in>>N>>M>>nrmuchii;
    for(i=1;i<=nrmuchii;i++) {
        in>>x>>y;
        v[x].push_back(y);
    }
    in.close();

}

int pairup( int nod) {

    int vecin,i;
    if(u[nod])
        return 0;
    u[nod]=1;
    for(i=0;i<v[nod].size();i++){
        vecin=v[nod][i];
        if(drept[vecin]==0) {
            stang[nod]=vecin;
            drept[vecin]=nod;
            return 1;
        }
    }
    for(i=0;i<v[nod].size();i++) {
        vecin=v[nod][i];
        if(pairup(drept[vecin])) {
            stang[nod]=vecin;
            drept[vecin]=nod;
            return 1;
        }
    }
    return 0;

}


void solve() {

    int ok,i;
    ok=1;
    while(ok) {
        ok=0;
        memset(u, 0, sizeof(u));
        for(i=1;i<=N;i++)
            if(stang[i]==0)
                if(pairup(i))
                    ok=1;
    }
    for(i=1;i<=N;i++)
        if(stang[i]>0)
            cuplaj++;

}

void afisare() {

    ofstream out("cuplaj.out");
    int i;
    out<<cuplaj<<'\n';
    for(i=1;i<=N;i++) {
        if(stang[i]>0)
            out<<i<<' '<<stang[i]<<'\n';
    }
    out.close();

}


int main() {

    citire();
    solve();
    afisare();
    return 0 ;

}