Cod sursa(job #953205)

Utilizator chimistuFMI Stirb Andrei chimistu Data 25 mai 2013 13:18:51
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <vector>
#define maxn 10001

using namespace std;

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

vector <int> A[maxn];
int l[maxn],r[maxn],u[maxn];

void reset(int *u,int n)
{
   fill(u,u+n,0);
}

int pereche(int k)
{
    unsigned int i;
    if (u[k])
        return 0;
    u[k] = 1;
    for (i=0;i<A[k].size();i++)
        if (!r[A[k][i]])
        {
            l[k] = A[k][i];
            r[A[k][i]] = k;
            return 1;
        }
    for (i=0;i<A[k].size();i++)
        if (pereche(r[A[k][i]]))
        {
            l[k] = A[k][i];
            r[A[k][i]] = k;
            return 1;
        }
    return 0;
}

int main()
{
    int n,m,e,cuplaj,i,a,b;
    f >> n >> m >> e;
    for (i=0;i<e;i++)
    {
        f >> a >> b;
        A[a].push_back(b);
    }
    cuplaj = 0;
    for (i=1;i<=n;i++)
    {
        if (!l[i])
            if (!pereche(i))
            {
                reset(u,n);
                cuplaj+=pereche(i);
            }
            else
                cuplaj++;
    }
    g << cuplaj <<"\n";
    for (i=1;i<=n;i++)
        if (l[i]>0)
            g << i << " " << l[i] << "\n";

    return 0;
}