Реализация Bellman Ford C ++ - PullRequest
       2

Реализация Bellman Ford C ++

3 голосов
/ 12 марта 2019

Я реализую алгоритм Беллмана Форда, в котором входной сигнал представляет собой ориентированный взвешенный граф, а выходной - 1 (отрицательный цикл) или 0 (отрицательный цикл отсутствует).

Я понимаю алгоритм Беллмана Форда и выполнил следующий код на довольно большом количестве тестовых случаев, но, похоже, не могу пройти все тестовые примеры на платформе, которую я хочу отправить. Я не вижу конкретного теста, где код не работает.

Любые указатели на то, где может быть проблема, были бы чрезвычайно полезны

Ограничения

1 ≤ n ≤ 10 ^ 3, 0 ≤ m ≤ 10 ^ 4, веса ребер являются целыми числами абсолютной величины не более 10 ^ 3. (n = вершины, m = ребра)

код

#include <iostream>
#include <limits>
#include <vector>

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

int negative_cycle(vector<vector<int>> &adj, vector<vector<int>> &cost) {
  vector<int> dist(adj.size(), std::numeric_limits<int>::max());
  dist[0] = 0;
  for (int i = 0; i < adj.size() - 1; i++) {
    for (int j = 0; j < adj.size(); j++) {
      for (int k = 0; k < adj[j].size(); k++) {
        if (dist[j] != std::numeric_limits<int>::max()) {
          if ((dist[adj[j][k]] > dist[j] + cost[j][k])) {
            dist[adj[j][k]] = dist[j] + cost[j][k];
          }
        }
      }
    }
  }
  for (int j = 0; j < adj.size(); j++) {
    for (int k = 0; k < adj[j].size(); k++) {
      if (dist[j] != std::numeric_limits<int>::max()) {
        if ((dist[adj[j][k]] > dist[j] + cost[j][k])) {
          return 1;  // negative cycle
        }
      }
    }
  }
  return 0;  // no negative cycle
}

int main() {
  int n, m;
  std::cin >> n >> m;
  vector<vector<int>> adj(n, vector<int>());
  vector<vector<int>> cost(n, vector<int>());
  for (int i = 0; i < m; i++) {
    int x, y, w;
    std::cin >> x >> y >> w;
    adj[x - 1].push_back(y - 1);
    cost[x - 1].push_back(w);
  }
  std::cout << negative_cycle(adj, cost);
}

1 Ответ

4 голосов
/ 12 марта 2019
vector<int> dist(adj.size(), std::numeric_limits<int>::max());
dist[0] = 0;

В этих строках вы отмечаете вершину # 0 как начальную точку, а все остальные вы помечаете как недоступные.Проблема состоит в том, что если ваш граф разделен на> = 2 различных части, он не найдет отрицательный цикл для части, которая не содержит вершину # 0, потому что вершины из другой части все еще будут недоступны.

Решение: установить все начальные расстояния на ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...