Я сделал алгоритм Эйлера пути (Эйлер-путь). в чем проблема?

Я сделал алгоритм пути Эйлера , в чем проблема?

      #include <cstdio>
#include <vector>
#include <iostream>
#include <list>
using namespace std;
int graph[1000][1000];  // 1<n<1000
int n; // 그래프는 n x n 
int i, j, degree[1000] = {},f=1;
list<int> lt1;
void oiler(int u) {
        for(int v=0;v<n;v++){
            while (graph[u][v]>0) {
                graph[u][v]--;
                graph[v][u]--;
                oiler(v);
                }
        }
        lt1.push_back(u);
 }
int main(void) {
    cin >> n;
    for (i = 0; i < n; i++) { 
        for (j = 0; j < n; j++) {
            cin >> graph[i][j];
            sum += graph[i][j]; 
        }
    }
    oiler(0);
    lt1.reverse();
    list<int>::iterator iter = lt1.begin();
    for(iter=lt1.begin(); iter!=lt1.end(); iter++) 
    { 
        printf("%d ", *iter+1);
    } 
}

ввод

      6 
0 1 0 1 1 1
1 0 1 1 1 0
0 1 0 1 0 0
1 1 1 0 1 0
1 1 0 1 0 1
1 0 0 0 1 0

выход

      1 2 3 4 1 5 2 4 5 6 1 

он работает и выдает истинный результат, но не прошел ... дайте мне знать, если я что-то пропустил

2 ответа

Вам не хватает определения sum, это не может быть скомпилировано. Вы его инициализировали? Вы намеревались добавить 1 к каждому элементу: *iter+1?

Также вы тратите время на изменение списка. Вы просто можете использовать push_front для std::list. В других случаях вы также можете выполнить итерацию в обратном порядке. В C ++ 20 с его std::views::

      // needs #include <ranges>

for (auto const& item : lt1| std::views::reverse) {
    std::cout << item << " ";
}

В C++11:

      for (auto iter = lt1.rbegin(), ei = lt1.rend(); iter != ei; ++iter) {
     std::cout << *iter << " ";
}

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

Я предполагаю, что вы занимаетесь онлайн-программированием и некоторые видимые тесты проходят, но весь набор тестов не работает, верно? Обновите описание проблемы, чтобы прояснить, в чем заключается ваша ошибка.

Тем не менее,

      for(iter=lt1.begin(); iter!=lt1.end(); iter++) 
{ 
    printf("%d ", *iter+1);
} 

- плохая идея, так как вы пытаетесь читать дальше конца списка. Вы не найдете там значимых данных, особенно если список пуст (n==0).

Пытаться

      for (auto const& item : lt1)
{
    std::cout << item;
}
Другие вопросы по тегам