Cod sursa(job #995833)

Utilizator classiusCobuz Andrei classius Data 10 septembrie 2013 12:36:41
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 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 s=0;

    for(int i=1;i<=n;i++){
        if(!lf[i]){
            if(!pairup(i)){
                memset(u,0,sizeof(u));
                s+=pairup(i);
            }else s++;
        }
    }
    g<<s<<'\n';

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

    return 0;
}