Cod sursa(job #2411249)

Utilizator aturcsaTurcsa Alexandru aturcsa Data 20 aprilie 2019 16:08:39
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <vector>

using namespace std;
ifstream fi("cuplaj.in");
ofstream fo("cuplaj.out");
int N,M,E;
vector <int> V[10001];
int L[10001];   /// L[i] arata varful din partea dreapta cu care este conectat varful i din partea stanga
int R[10001];   /// R[i] arata varful din partea stanga cu care este conectat varful i din partea dreapta
int U[10001];

int cupleaza(int sursa)
{
    if (U[sursa]==1)
        return 0;
    U[sursa]=1;
    for (int i=0;i<V[sursa].size();i++)
    {
        int p;
        p=V[sursa][i];
        if (R[p]==0)
        {
            L[sursa]=p;
            R[p]=sursa;
            return 1;
        }
    }
    for (int i=0;i<V[sursa].size();i++)
    {
        int p;
        p=V[sursa][i];
        if (cupleaza(R[p]))
        {
            L[sursa]=p;
            R[p]=sursa;
            return 1;
        }
    }
    return 0;
}

int main()
{
    fi>>N>>M>>E;
    for (int i=1;i<=E;i++)
    {
        int x,y;
        fi>>x>>y;
        V[x].push_back(y);
    }
    while (1)
    {
        int t;
        for (int i=1;i<=N;i++)
            U[i]=0;
        t=0;
        for (int i=1;i<=N;i++)
            if (L[i]==0)
                t=t | cupleaza(i);
        if (t==0)
            break;
    }
    int rez;
    rez=0;
    for (int i=1;i<=N;i++)
        if (L[i]!=0)
            rez++;
    fo<<rez<<"\n";
    for (int i=1;i<=N;i++)
        if (L[i]!=0)
            fo<<i<<" "<<L[i]<<"\n";
    fi.close();
    fo.close();
    return 0;
}