贝尔曼福特实现 C++

Posted

技术标签:

【中文标题】贝尔曼福特实现 C++【英文标题】:Bellman Ford implementation C++ 【发布时间】:2019-03-12 10:18:24 【问题描述】:

我正在实现 Bellman Ford 算法,其中输入是有向加权图,输出是 1(有负循环)或 0(没有负循环)。

我了解 Bellman Ford 算法,并在很多测试用例上运行了以下代码,但似乎无法通过我希望提交的平台上的所有测试用例。我看不到代码失败的特定测试用例。

任何关于问题可能出在哪里的指针都会非常有帮助

约束

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);

【问题讨论】:

请花点时间刷新the help pages,以the SO tour,尤其是how to ask good questions,以及this question checklist。最后,请learn how to debug your programs。 节点数、边数和最大绝对权重值有什么限制? @Photon 添加了约束! 我会手动进行一次失败的运行并将它们与调试值进行比较。 @Someprogrammerdude 的挫败感让我写了这个问题,但我完全理解。我浏览了您提供的链接,确保从现在开始遵守规则。谢谢 :) (我应该删除这个问题吗?) 【参考方案1】:
vector<int> dist(adj.size(), std::numeric_limits<int>::max());
dist[0] = 0;

在这一行中,您将顶点#0 标记为起点,而将所有其他顶点标记为不可到达。问题是,如果您的图被分成 >=2 个不同的部分,它不会为不包含顶点 #0 的部分找到负循环,因为来自其他部分的顶点仍然无法访问。

解决方案:将所有初始距离设置为零。

【讨论】:

以上是关于贝尔曼福特实现 C++的主要内容,如果未能解决你的问题,请参考以下文章

贝尔曼福特和一个奥林匹克问题?

c_cpp 在Graph |中检测负循环(贝尔曼福特)

贝尔曼福特算法

networkx图论贝尔曼-福特Bellman Ford Algorithm最短路径,Python

算法入门之完美单源最短路径:Bellman-Ford(贝尔曼-福特)算法

Bellman-Ford算法