71742024-01-01 19:56:06kukkermanTestnevelés óracpp17Accepted 50/50222ms52152 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;
}
SubtaskSumTestVerdictTimeMemory
base50/50
1Accepted0/03ms1812 KiB
2Accepted0/03ms2184 KiB
3Accepted0/0186ms16876 KiB
4Accepted2/23ms2340 KiB
5Accepted3/33ms2584 KiB
6Accepted3/33ms2792 KiB
7Accepted3/33ms2848 KiB
8Accepted1/13ms2976 KiB
9Accepted3/33ms3104 KiB
10Accepted3/34ms3212 KiB
11Accepted3/34ms3628 KiB
12Accepted1/14ms3656 KiB
13Accepted2/24ms3728 KiB
14Accepted3/33ms3716 KiB
15Accepted1/1159ms14484 KiB
16Accepted3/3143ms22592 KiB
17Accepted5/557ms16984 KiB
18Accepted1/1222ms27968 KiB
19Accepted2/2156ms15348 KiB
20Accepted3/3200ms40060 KiB
21Accepted4/4189ms52152 KiB
22Accepted4/4187ms44696 KiB