Cod sursa(job #995835)

Utilizator classiusCobuz Andrei classius Data 10 septembrie 2013 12:39:31
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

typedef vector<int>::iterator vit;
vector<int> ve[10001];
int lf[10001],rt[10001];
bool u[10001];

bool pairup(const int n){

    if(u[n]) return 0;
    u[n]=1;

    for(vit it=ve[n].begin();it!=ve[n].end();it++)
        if(!rt[*it]){
            rt[*it]=n;
            lf[n]=*it;
            return 1;
        }

    for(vit it=ve[n].begin();it!=ve[n].end();it++)
        if(pairup(rt[*it])){
            rt[*it]=n;
            lf[n]=*it;
            return 1;
        }

    return 0;
}

int main()
{
    int n,m,k;
    f>>n>>m>>k;

    while(k--){
        int x,y;
        f>>x>>y;
        ve[x].push_back(y);
    }

    int ok=1;

    while(ok){
        ok=0;
        memset(u,0,sizeof(u));
        for(int i=1;i<=n;i++)
            if(!lf[i])
                ok|=pairup(i);
    }

    int s=0;

    for(int i=1;i<=n;i++)
        s+=(bool)lf[i];

    g<<s<<'\n';

    for(int i=1;i<=n;i++)
        if(lf[i])
            g<<i<<" "<<lf[i]<<'\n';

    return 0;
}