Cod sursa(job #2373238)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 7 martie 2019 12:48:17
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

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

const int VAL=10005;

int N, M, i, j, A, B, E;
int L[VAL], R[VAL], ANS;
bool nemodif, tried[VAL];
vector <int> G[VAL];
vector <int> :: iterator it;

bool PairUP(int nod)
{
    if (tried[nod]==true)
        return false;
    tried[nod]=true;
    vector <int> :: iterator it;
    for (it=G[nod].begin(); it!=G[nod].end(); it++)
    {
        if (L[*it]==0)
        {
            R[nod]=*it;
            L[*it]=nod;
            ANS++;
            return true;
        }
    }
    for (it=G[nod].begin(); it!=G[nod].end(); it++)
    {
        if (PairUP(L[*it])==true)
        {
            R[nod]=*it;
            L[*it]=nod;
            return true;
        }
    }
    return false;
}

int main()
{
    fin >> N >> M >> E;
    for (i=1; i<=E; i++)
    {
        fin >> A >> B;
        G[A].push_back(B);
    }
    while (1)
    {
        nemodif=true;
        for (i=1; i<=N; i++)
            tried[i]=false;
        for (i=1; i<=N; i++)
            if (R[i]==0 && PairUP(i)==true)
                nemodif=false;
        if (nemodif==true)
            break;
    }
    fout << ANS << '\n';
    for (i=1; i<=N; i++)
        if (R[i]>0)
            fout << i << " " << R[i] << '\n';
    fin.close();
    fout.close();
    return 0;
}