Повідомлення


Submit solution

Points: 100 (partial)
Time limit: 1.0s
Memory limit: 256M

Author:
Problem type

У мережі МіКро є \(n\) комп'ютерів та \(m\) з'єднань. Ваше завдання - визначити, чи може Петрик надіслати повідомлення Марії, і якщо це можливо, то скільки мінімально комп'ютерів буде на такому маршруті.

Input Specification

Перша строка вхідних даних містить два цілі числа \(n\) \((2\leq n \leq 10^5)\) та \(m\) \((1\leq n \leq 2 * 10^5)\): кількість комп'ютерів та з'єднань. Комп'ютери пронумеровані від \(1\) до \(n\). Комп'ютер Петрика має номер \(1\), а комп'ютер Марії - номер \(n\).

Далі йдуть \(m\) строк, що описують з'єднання. Кожна строка містить два цілі числа \(a\) та \(b\) \((1\leq a, b \leq n)\): між цими комп'ютерами є з'єднання.

Кожне з'єднання існує між двома різними комп'ютерами, і між будь-якими двома комп'ютерами може бути максимум одне з'єднання.

Output Specification

Якщо можна надіслати повідомлення, спочатку виведіть \(k\): мінімальну кількість комп'ютерів на валідному маршруті. Після цього виведіть приклад такого маршруту. Ви можете вивести будь-яке правильне рішення. Якщо маршрути відсутні, виведіть \(-1\).

Sample Input 1

5 5
1 2
1 3
1 4
2 3
5 4

Sample Output 1

3
1 4 5

Comments


  • 0
    oryshych_d  commented on June 27, 2025, 7:50 a.m.

    include <algorithm>

    include <iostream>

    include <queue>

    include <vector>

    using std::cout; using std::endl; using std::vector;

    int main() { int n, m; std::cin >> n >> m;

    vector<vector<int>> graph(n);
    for (int i = 0; i < m; i++) {
        int a, b;
        std::cin >> a >> b;
        graph[a - 1].push_back(b - 1);
    }
    
    vector<int> in_degree(n);
    for (const vector<int> &nodes : graph) {
        for (int node : nodes) { in_degree[node]++; }
    }
    
    std::queue<int> queue;
    for (int i = 0; i < n; i++) {
        if (in_degree[i] == 0) { queue.push(i); }
    }
    vector<int> top_sort;
    while (!queue.empty()) {
        int curr = queue.front();
        queue.pop();
        top_sort.push_back(curr);
        for (int next : graph[curr]) {
            if (--in_degree[next] == 0) { queue.push(next); }
        }
    }
    
    if (top_sort.size() == n) {
        for (int i = 0; i < n - 1; i++) { cout << top_sort[i] + 1 << ' '; }
        cout << top_sort.back() + 1 << endl;
    } else {
        cout << "IMPOSSIBLE" << endl;
    }

    }