Cod sursa(job #768977)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 17 iulie 2012 23:26:30
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <algorithm>
#include <cstring>
#include <vector>
#define N 10010

using namespace std;

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

int n,m,i,a,b,L[N],R[N],e,ok=1,ANS;
bool C[N];
vector<int> A[N];

int Pair (int nod)
{
    if (C[nod]) return 0;
    C[nod]=1;
    unsigned int i;
    for (i=0;i<A[nod].size();i++)
        if (!R[A[nod][i]])
        {
            R[A[nod][i]]=nod;
            L[nod]=A[nod][i];
            return 1;
        }
    for (i=0;i<A[nod].size();i++)
        if (Pair(R[A[nod][i]]))
        {
            R[A[nod][i]]=nod;
            L[nod]=A[nod][i];
            return 1;
        }
    return 0;
}

int main ()
{
    f >> n >> m >> e;
    for (i=1;i<=e;i++)
    {
        f >> a >> b;
        A[a].push_back(b);
    }
    while (ok)
    {
        ok=0;
        memset(C,0,sizeof(C));
        for (i=1;i<=n;i++)
            if (!L[i])
                ok+=Pair(i);
    }
    for (i=1;i<=n;i++)
        if (L[i])
            ANS++;
    g << ANS << '\n';
    for (i=1;i<=n;i++)
        if (L[i])
            g << i << ' ' << L[i] << '\n';
    f.close();g.close();
    return 0;
}