Задача из яндекс контест по графам. 2 варианта кода, один проходит все тесты другой нет, почему?

Рейтинг: -2Ответов: 1Опубликовано: 22.08.2023

Ниже представлены два кода, тот, что на Python мой. На плюсах взял из инета. Алгоритм на плюсах проходит все тесты. Мой не проходит 6 тест (не знаю точно какие входные данные). Помогите разобраться в чем может быть ошибка и на каких входных данных может мой код выдавать ошибку. Моя фантазия на тесты иссякла, два дня сидел придумывал разные тесты, но так и не нашёл в чём дело. Я использую DFS, алгоритм на плюсах - BFS

Задача В заданном корневом дереве найдите вершины, максимально удалённые от корня. Расстоянием между вершинами считается количество рёбер в пути.

Формат ввода В первой строке задано n — количество вершин в дереве (1 ≤ n ≤ 100). В следующих n − 1 строках заданы вершины, являющиеся предками вершин 2, 3, …, n. Вершина 1 является корнем дерева.

Формат вывода В первой строке выведите максимальное расстояние от корня до остальных вершин дерева. Во второй строке выведите, сколько вершин дерева находятся от корня на таком расстоянии. В третьей строке выведите номера этих вершин через пробел в порядке возрастания.

Пример 1

    Ввод    
    3
    1
    1
    
    Вывод
    1
    2
    2 3
    


 Пример 2
    
    Ввод    
    3
    1
    2
    
    Вывод
    2
    1
    3

Python

count = int(input())

graph = {}
costs = {}
for i in range(count):
    graph[i + 1] = []
      
for i in range(count - 1):
    parent = int(input())
    graph[parent].append(i + 2)      

costs[1] = 0
def dfs(head, max_dist):
    for node in graph[head]:    
        costs[node] = costs[head] + 1
        if costs[node] >  max_dist:
            max_dist = costs[node]    
        max_dist = dfs(node, max_dist)

    return max_dist   

max_dist = dfs(1, 0)  
print(max_dist)

count_max = 0
answer = []
for item in costs.keys():
    if costs[item] == max_dist:
        count_max += 1
        answer.append(item) 

print(count_max)
print(' '.join([str(item) for item in answer]))

C++

#include <algorithm>
#include <queue>
#include <iostream>
#include <utility>
#include <vector>

using namespace std;

int main(int argc, const char * argv[]) {
    int n;
    cin >> n;
    vector<vector<int> > gr(n+1);
    for (int i = 2; i <= n; ++i) {
        int a;
        cin >> a;
        gr[a].push_back(i);
    }
    
    vector<int> nodes;
    queue<int> q;
    q.push(1);
    int depth = -1;
    while (!q.empty()) {
        int m = q.size();
        depth += 1;
        nodes.clear();
        for (int i = 0; i < m; ++i) {
            int u = q.front();
            nodes.push_back(u);
            q.pop();
            for (const auto& v : gr[u]) {
                q.push(v);
            }
        }
    }
    
    sort(nodes.begin(), nodes.end());
    
    cout << depth << "\n" << nodes.size() << "\n";
    
    for (const auto& u : nodes) {
        cout << u << " ";
    }
    return 0;
}

Ответы

▲ 1Принят

... выведите номера этих вершин через пробел в порядке возрастания.

Ваше решение порядок не фиксирует - кто первый встретился, тот первый печатается:

$ cat temp.txt
5
1
1
3
2

$ python temp.py < temp.txt
2
2
5 4