作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我曾尝试为邻接矩阵实现 Bellman Ford Single Source Shortest Path,但它没有检测到负循环中的顶点之一
相同的算法适用于边缘列表,但在邻接矩阵中给出错误
这是图表的样子:
我的代码:
#include <iostream>
#include <climits>
#include <vector>
using namespace std;
#define INF INT_MAX
#define NINF INT_MIN
void shortestpath(int src, vector<vector<int>> &matrix){
int N = matrix.size();
vector<int> dist(N, INF);
vector<int> prev(N, 0);
dist[src] = 0;
for(int k = 0; k < N-1; k++){
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
if(dist[i] != INF && matrix[i][j] && dist[j] > (dist[i] + matrix[i][j]) ){
dist[j] = dist[i] + matrix[i][j];
prev[j] = i;
}
}
}
}
// for(int i = 0; i < N; i++)
// if(i != src)
// cout << src << " - " << i << "\t" << dist[i] << endl;
// cout << "\n\n";
// to check if -ve cycles exist or not
for(int k = 0; k < N-1; k++){
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
if(matrix[i][j] && dist[j] > (dist[i] + matrix[i][j]) ){
dist[j] = NINF;
prev[j] = -1;
}
}
}
}
for(int i = 0; i < N; i++)
if(i != src)
cout << src << " - " << i << "\t" << dist[i] << endl;
return ;
}
// Driver function
int main(){
int V = 8;
vector<vector<int>> matrix(V, vector<int>(V, 0));
matrix[0][1] = 1;
matrix[1][2] = 1;
matrix[2][4] = 1;
matrix[4][3] = -3;
matrix[3][2] = 1;
matrix[1][5] = 4;
matrix[1][6] = 4;
matrix[5][6] = 5;
matrix[6][7] = 4;
matrix[5][7] = 3;
shortestpath(0, matrix);
return 0;
}
输出 :
0 -> 1 = 1
0 -> 2 = -2147483648
0 -> 3 = -3
0 -> 4 = -2147483648
0 -> 5 = 5
0 -> 6 = 5
0 -> 7 = 8
在 2->4->3 有一个 -ve 循环,但我的代码只检测到 2 和 4
最佳答案
在第二个循环中,dist[i] + matrix[i][j]
如果 dist[i]
,可能会通过整数溢出表现出未指定的行为已经设置为 INT_MIN
和 matrix[i][j]
是否定的。在实践中,总和环绕为一个很大的正数,然后条件 dist[j] > (dist[i] + matrix[i][j])
不成立,和dist[j]
没有更新。
关于c++ - 贝尔曼福特单源最短路径的邻接矩阵未检测到负循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63689965/
单源 C++ 编程模型是什么意思。我最近开始了解 SYCL,人们将其描述为与 OPENCL 相关的单源 C++ 编程模型。我非常感谢描述 SYCL 是什么的答案?它是如何工作的?谢谢大家! 最佳答案
我正在尝试解决 A Dijkstra 问题 Alpha #20 Prob C并在 Case 31 上获得 TLE,它有 100000 节点和 99999 边。我假设我的代码的复杂度为 O(E lg V
我是一名优秀的程序员,十分优秀!