我正在实施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);
}
vector<int> dist(adj.size(), std::numeric_limits<int>::max());
dist[0] = 0;
在这一行中,您将顶点#0标记为起点,而将所有其他标记为无法到达。问题是,如果您的图形被划分为> = 2个不同的部分,则不会为不包含顶点#0的部分找到负循环,因为来自其他部分的顶点仍然无法访问。
解决方案:将所有初始距离设置为零。