Cod sursa(job #900857)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 28 februarie 2013 22:16:21
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<fstream>
#include<vector>
#include<cstring>
#define dim 10007

using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int r[dim],l[dim];
vector<int>G[dim];
int n,m,i,j,sol,ok,viz[dim],e,x,y;
int cuplaj( int x ) {

    if(viz[x])
        return 0;
    viz[x]=1;
    for(int i=0;i<G[x].size();++i){
        int fiu=G[x][i];
        if(!r[fiu] || cuplaj(r[fiu])){
            r[fiu]=x;
            l[x]=fiu;
            return 1;
        }

    }
    return 0;
}
int main () {
    f>>n>>m>>e;

    for(i=1;i<=e;++i){
        f>>x>>y;

        G[x].push_back(y);
    }
    ok=1;
    do{
        ok=0;
        memset(viz,0,sizeof(viz));
        for(i=1;i<=n;++i){
            if(!l[i]){
                ok|=cuplaj(i);
            }
        }

    }while(ok);
    int sol=0;
    for(i=1;i<=n;++i){
        sol+=(l[i]>0);
    }
    g<<sol<<"\n";
    for(i=1;i<=n;++i){
        if(l[i]){
            g<<i<<" "<<l[i]<<"\n";
        }
    }
    return 0;
}