Cod sursa(job #1342660)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 14 februarie 2015 13:27:44
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <cstring>
#include <vector>
#define DIM 100011
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n,m,q,sol;
int L[DIM],R[DIM],viz[DIM];

vector<int> C[DIM];

bool cuplaj(int nod){
    vector<int>::iterator it;
    if(viz[nod])
        return 0;
    viz[nod]=1;
    //I:
    for(it=C[nod].begin();it!=C[nod].end();it++){
        if(!R[*it]){
            L[nod]=*it;
            R[*it]=nod;
            return true;
        }
    }
    //II:
    bool rez;
    for(it=C[nod].begin();it!=C[nod].end();it++){
        rez=cuplaj(R[*it]);
        if(rez){
            L[nod]=*it;
            R[*it]=nod;
            return true;
        }
    }
    return false;
}

int main(void){
    register int i,j,x,y;
    bool ok,rez;

    f>>n>>m>>q;
    for(i=1;i<=q;i++)
        f>>x>>y,C[x].push_back(y);

    do{ok=false;
        for(i=1;i<=n;i++){
            if(!L[i])
                rez=cuplaj(i);
            if(rez)
                ok=true;
        }
        memset(viz,0,sizeof(viz));
    }while(ok);

    for(i=1;i<=n;i++)
        sol+=(L[i]==0?0:1);
    g<<sol<<"\n";
    for(i=1;i<=n;i++)
        if(L[i]) g<<i<<" "<<L[i]<<"\n";
    f.close();
    g.close();
    return 0;
}