Cod sursa(job #2279917)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 10 noiembrie 2018 10:25:11
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX=1e4+5;

int L[NMAX], R[NMAX];

int N, M, E, i, om, meserie;

int done, ans;

bool Marked[NMAX];

vector <int> V[NMAX];

bool cupleaza (int node)
{
    Marked[node]=true; //am incercat;

    for(auto it : V[node])
        if(!R[it])
        {
            L[node]=it;

            R[it]=node;

            return 1;
        }

    for(auto it : V[node])
        if(!Marked[R[it]] && cupleaza(R[it]))
        {
            L[node]=it;

            R[it]=node;

            return 1;
        }

    return 0;
}

int main()
{
    f>>N>>M>>E;

    for(i=1; i<=E; ++i)
    {
        f>>om>>meserie;

        V[om].push_back(meserie);
    }

    done=1;

    while(done)
    {
        done=0;

        for(i=1; i<=N; i++)
            Marked[i]=false;

        for(i=1; i<=N; i++)
            if(!L[i] && !Marked[i])
                done|=cupleaza(i);

    }

    for(i=1; i<=N; i++)
        if(L[i]!=0)
            ans++;

    g<<ans<<'\n';

    for(i=1; i<=N; i++)
        if(L[i])
            g<<i<<' '<<L[i]<<'\n';


    return 0;
}