7174 2024. 01. 01 19:56:06 kukkerman Testnevelés óra cpp17 Elfogadva 50/50 222ms 52152 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

using Emlekek = std::vector<std::pair<int, int>>;

void beolvas(std::istream &be, int &n, Emlekek &emlekek) {
    be >> n;

    int k;
    be >> k;

    emlekek.resize(k);
    for (auto &e : emlekek) {
        be >> e.first >> e.second;
    }
}

using Graf = std::vector<std::vector<int>>;

enum class Allapot {
    Felderitetlen,
    FeldolgozasAlatt,
    Feldologozott
};

bool dfs(int akt, const Graf &g, std::vector<Allapot> &allapot, std::vector<int> &sorrend) {
    switch (allapot[akt]) {

    case Allapot::Felderitetlen:
        allapot[akt] = Allapot::FeldolgozasAlatt;
        for (auto sz : g[akt]) {
            if (!dfs(sz, g, allapot, sorrend)) {
                return false;
            }
        }
        sorrend.push_back(akt + 1);
        allapot[akt] = Allapot::Feldologozott;
        return true;

    case Allapot::FeldolgozasAlatt:
        return false;

    case Allapot::Feldologozott:
        return true;
    }

    return false;
}

bool van_ele(const Graf &g, int honnan, int hova) {
    return std::find(g[honnan].cbegin(), g[honnan].cend(), hova) != g[honnan].cend();
}

void sorrend_ki(const std::vector<int> &sorrend) {
    std::copy(sorrend.crbegin(), sorrend.crend(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}

void feldolgoz(int n, const Emlekek &emlekek) {
    Graf g(n);
    for (const auto &e : emlekek) {
        g[e.first - 1].push_back(e.second - 1);
    }

    std::vector<Allapot> allapot(n, Allapot::Felderitetlen);
    std::vector<int> sorrend;
    for (auto i = 0; i < n; i++) {
        if (allapot[i] == Allapot::Felderitetlen) {
            if (!dfs(i, g, allapot, sorrend)) {
                sorrend.clear();
                break;
            }
        }
    }

    using std::cout;

    if (!sorrend.empty()) {
        int i;
        for (i = n - 1; i > 0 && van_ele(g, sorrend[i] - 1, sorrend[i - 1] - 1); --i) {}
        if (i == 0) {
            cout << "1\n";
            sorrend_ki(sorrend);

        } else {
            cout << "2\n";
            sorrend_ki(sorrend);
            std::swap(sorrend[i], sorrend[i - 1]);
            sorrend_ki(sorrend);
        }

    } else {
        cout << "0\n";
    }
}

int main() {
    int n;
    Emlekek e;
    beolvas(std::cin, n, e);

    feldolgoz(n, e);

    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 50/50
1 Elfogadva 0/0 3ms 1812 KiB
2 Elfogadva 0/0 3ms 2184 KiB
3 Elfogadva 0/0 186ms 16876 KiB
4 Elfogadva 2/2 3ms 2340 KiB
5 Elfogadva 3/3 3ms 2584 KiB
6 Elfogadva 3/3 3ms 2792 KiB
7 Elfogadva 3/3 3ms 2848 KiB
8 Elfogadva 1/1 3ms 2976 KiB
9 Elfogadva 3/3 3ms 3104 KiB
10 Elfogadva 3/3 4ms 3212 KiB
11 Elfogadva 3/3 4ms 3628 KiB
12 Elfogadva 1/1 4ms 3656 KiB
13 Elfogadva 2/2 4ms 3728 KiB
14 Elfogadva 3/3 3ms 3716 KiB
15 Elfogadva 1/1 159ms 14484 KiB
16 Elfogadva 3/3 143ms 22592 KiB
17 Elfogadva 5/5 57ms 16984 KiB
18 Elfogadva 1/1 222ms 27968 KiB
19 Elfogadva 2/2 156ms 15348 KiB
20 Elfogadva 3/3 200ms 40060 KiB
21 Elfogadva 4/4 189ms 52152 KiB
22 Elfogadva 4/4 187ms 44696 KiB