Cod sursa(job #1380043)

Utilizator CartofenAndrei Cartof Cartofen Data 6 martie 2015 21:19:41
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
#include <vector>
using namespace std;

#define NMax 10005

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

int n,m,e;
vector<int> v[NMax];
bool viz[NMax];
int R[NMax],L[NMax];

int pairup(int x)
{
    if(viz[x]) return 0;
    viz[x] = true;

    for(int i=0;i<v[x].size();++i) if(!R[v[x][i]])
    {
        R[v[x][i]] = x;
        L[x] = v[x][i];
        return 1;
    }

    for(int i=0;i<v[x].size();++i) if(pairup(R[v[x][i]]))
    {
        R[v[x][i]] = x;
        L[x] = v[x][i];
        return 1;
    }

    return 0;
}

int main()
{
    int i,a,b;

    f>>n>>m>>e;
    for(i=1;i<=e;++i)
    {
        f>>a>>b;
        v[a].push_back(b);
    }

    int change = 1;
    while(change)
    {
        change = 0;
        for(i=1;i<=n;++i) viz[i] = false;
        for(i=1;i<=n;++i) if(!L[i]) change|=pairup(i);
    }

    int cup = 0;
    for(i=1;i<=n;++i) if(L[i]) cup++;
    g<<cup<<"\n";
    for(i=1;i<=n;++i) if(L[i]) g<<i<<" "<<L[i]<<"\n";

    f.close();
    g.close();
    return 0;
}