Cod sursa(job #932434)

Utilizator ephgstefana gal ephg Data 28 martie 2013 21:50:07
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<fstream>
#include<bitset>
#include<vector>
using namespace std;

#define BM 10005
#define it vector<int>::iterator

int n,m,nrm,dim;
bitset<BM> fol;
int st[BM],dr[BM];
vector<int> gr[BM];

int cp(int i){
    it j;
    if(fol[i])return 0;
    fol[i]=1;
    for(j=gr[i].begin();j!=gr[i].end();++j){
        if(dr[*j]==0){
            dr[*j]=i;
            st[i]=*j;
            return 1;
        }
    }
    for(j=gr[i].begin();j!=gr[i].end();++j){
        if(cp(dr[*j])){
            st[i]=*j;
            dr[*j]=i;
            return 1;
        }
    }
    return 0;
}
int main (){
    int i,a,b,ok=1;
    ifstream f("cuplaj.in");
    ofstream g("cuplaj.out");
    f>>n>>m>>nrm;
    for(;nrm;--nrm){
        f>>a>>b;
        gr[a].push_back(b);
    }
    for(;ok;){
        ok=0;
        fol&=0;
        for(i=1;i<=n;++i)if(st[i]==0&&cp(i))++ok;
    }
    for(i=1;i<=n;++i)if(st[i])++dim;
    g<<dim<<'\n';
    for(i=1;i<=n;++i)if(st[i])g<<i<<' '<<st[i]<<'\n';
    return 0;
}