Cod sursa(job #1206512)

Utilizator t.g.g.tt.g.g.t t.g.g.t Data 10 iulie 2014 12:40:36
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;

vector<int> lda[10005];
int v1[10005],v2[10005],n,m,e,x,y,trecut[10005],sol;

bool calc(int nod)
{
    if (trecut[nod]==1) return 0;
    trecut[nod]=1;

    for (int i=0;i<lda[nod].size();++i)
    {
        if (v2[lda[nod][i]]==0)
        {
            v1[nod]=lda[nod][i];
            v2[lda[nod][i]]=nod;
            return 1;
        }
    }

    for (int i=0;i<lda[nod].size();++i)
    {
        if (calc(v2[lda[nod][i]]))
        {
            v1[nod]=lda[nod][i];
            v2[lda[nod][i]]=nod;
            return 1;
        }
    }

    return 0;
}

int main()
{
    ifstream in ("cuplaj.in");
    ofstream out ("cuplaj.out");

    in>>n>>m>>e;

    for (int i=1;i<=e;++i)
    {
        in>>x>>y;
        lda[x].push_back(y);
    }

    bool advr=1;

    while (advr)
    {
        advr=0; memset(trecut,0,sizeof(trecut));
        for (int i=1;i<=n;++i)
            if (v1[i]==0)
            {
                advr=advr | calc(i);
            }
    }

    for (int i=1;i<=n;++i) if (v1[i]!=0) ++sol;

    out<<sol<<"\n";

    for (int i=1;i<=n;++i) if (v1[i]!=0) out<<i<<" "<<v1[i]<<"\n";

    in.close();
    out.close();
    return 0;
}