Cod sursa(job #2297545)

Utilizator Tataru_AdelinTataru Adelin Tataru_Adelin Data 5 decembrie 2018 23:24:20
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;


void reset(vector <bool> &v)
{
    for(unsigned i = 0; i < v.size(); i++)
        v[i] = false;
}

bool cupleaza(int k, vector < vector <int>> &path, vector <int> &con_left, vector <int> &con_right, vector <bool> &viz)
{
    if(viz[k])
        return false;

    viz[k] = true;

    int vec;

    for(unsigned i = 0; i < path[k].size(); i++)
    {
        vec = path[k][i];
        if(con_right[vec] == 0)
        {
            con_left[k] = vec;
            con_right[vec] = k;
            return true;
        }
    }

    for(unsigned i = 0; i < path[k].size(); i++)
    {
        vec = path[k][i];
        if(cupleaza(con_right[vec], path, con_left, con_right, viz))
        {
            con_left[k] = vec;
            con_right[vec] = k;
            return true;
        }
    }

    return false;
}

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

int main()
{
    int left, right, edges, nr_con = 0;
    fin>>left>>right>>edges;

    vector < vector <int>> path(left + 1);
    vector <int> con_left(left + 1, 0);
    vector <int> con_right(right + 1, 0);
    vector <bool> viz(left + 1);

    int x, y;
    for(; edges; edges--)
    {
        fin>>x>>y;
        path[x].push_back(y);
    }

    bool ok = true;

    while(ok)
    {

        ok = false;

        reset(viz);

        for(int i = 1; i <= left; i++)
        {
            if(con_left[i] == 0)
            {
                if(cupleaza(i, path, con_left, con_right, viz))
                {
                    ok = true;
                    nr_con ++;
                }
            }
        }
    }

    fout<<nr_con<<'\n';

    for(int i = 1; i <= left; i++)
    {
        if(con_left[i] != 0)
            fout<<i<<' '<<con_left[i]<<'\n';
    }

    return 0;
}