Cod sursa(job #2898242)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 6 mai 2022 14:52:23
Problema Strazi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
/// Preset de infoarena
#include <fstream>
#include <vector>

using namespace std;

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

const int maxN = 260;
int n, m, l[maxN], r[maxN], nrlant;
vector <int> G[maxN], lant[maxN], ordine;
vector <pair<int, int>> newmuc;
bool used[maxN];

bool pairup(int nod)
{
    if(used[nod])
        return 0;
    used[nod] = 1;
    for(int vecin : G[nod])
    {
        if(!r[vecin])
        {
            l[nod] = vecin;
            r[vecin] = nod;
            return 1;
        }
    }
    for(int vecin : G[nod])
    {
        if(pairup(r[vecin]))
        {
            l[nod] = vecin;
            r[vecin] = nod;
            return 1;
        }
    }
    return 0;
}

int main()
{
    fin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        int x, y;
        fin >> x >> y;
        G[x].push_back(y);
    }
    bool changed = 1;
    while(changed)
    {
        changed = 0;
        for(int i = 1; i <= n; i++)
            used[i] = 0;
        for(int i = 1; i <= n; i++)
            if(!l[i])
                changed |= pairup(i);
    }

    for(int i = 1; i <= n; i++)
    {
        if(r[i])
            continue;
        nrlant++;
        for(int x = i; x != 0; x = l[x])
            lant[nrlant].push_back(x);
    }
    for(int i = 1; i <= nrlant; i++)
    {
        if(i != nrlant)
        newmuc.push_back({lant[i].back(), lant[i + 1][0]});
        for(int elem : lant[i])
            ordine.push_back(elem);
    }
    fout << newmuc.size() << '\n';
    for(auto elem : newmuc)
        fout << elem.first << ' ' << elem.second << '\n';
    for(int elem : ordine)
        fout << elem << ' ';
    return 0;
}