Cod sursa(job #591746)

Utilizator mihai995mihai995 mihai995 Data 25 mai 2011 14:31:50
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <vector>
using namespace std;

const int N=100002;
int S[N],D[N],nr;
bool use[N];
vector<int> a[N];

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

bool pairup(int x)
{
    if (!x || use[x])
        return false;
    use[x]=true;
    for (vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
        if (!D[*i])
        {
            S[x]=*i;
            D[*i]=x;
            ++nr;
            return true;
        }
    for (vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
        if (pairup(D[*i]))
        {
            S[x]=*i;
            D[*i]=x;
            return true;
        }
    return false;
}

void cuplaj()
{
    bool go=true;
    int i;
    while (go)
    {
        go=false;
        for (i=1;i<=S[0];i++)
            use[i]=false;
        for (i=1;i<=S[0];i++)
            if (!S[i])
                go|=pairup(i);
    }
}

int main()
{
    int k,x,y,i;
    in>>S[0]>>D[0]>>k;
    while (k--)
    {
        in>>x>>y;
        a[x].push_back(y);
    }
    cuplaj();
    out<<nr<<"\n";
    for (i=1;i<=S[0];i++)
        if (S[i])
            out<<i<<" "<<S[i]<<"\n";
    return 0;
}