Cod sursa(job #1318231)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 15 ianuarie 2015 19:27:44
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;


vector <int> G[10010];
int N1,N2,M;
int D[10010],S[10010],Sol;
bool used[10010];

void Citire() {

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

}

int Pair_Up(int nod) {

    if(used[nod])
        return 0;
    used[nod]=1;
    for(int i=0;i<G[nod].size();i++) {
        int vecin=G[nod][i];
        if(D[vecin]==0) {
            S[nod]=vecin;
            D[vecin]=nod;
            return 1;
        }
    }

    for(int i=0;i<G[nod].size();i++) {
        int vecin=G[nod][i];
        if(Pair_Up(D[vecin])) {
            S[nod]=vecin;
            D[vecin]=nod;
            return 1;
        }
    }
    return 0;
}


void Solve() {

    int ok=1;
    while(ok){
        ok=0;
        memset(used, 0, sizeof(used));
        for(int i=1;i<=N1;i++)
            if(S[i]==0)
                if(Pair_Up(i))
                    ok=1;
    }

    for(int i=1;i<=N1;i++)
        if(S[i])
            Sol++;

}

void Afisare() {

    ofstream out("cuplaj.out");
    out<<Sol<<'\n';
    for(int i=1;i<=N1;i++)
        if(S[i])
            out<<i<<" "<<S[i]<<'\n';
    out.close();

}

int main () {

    Citire();
    Solve();
    Afisare();
    return 0;

}