如何修复无向图?
How to fix a directed graph on undirected?
本文关键字:何修复 更新时间:2023-10-16
我无法正确更正代码,因此图形是无向的。通过输入,按条件,应该有许多顶点,边,然后是相邻顶点及其权重的列表
using namespace std;
const int inf = 10000000;
struct edge {
int u, v, w;
};
int n, m, v, i;
vector<edge> e;
void solve() {
vector<int> d(n, inf);
d[v] = 0;
for (;;) {
bool any = false;
for (int j = 0; j < m; ++j)
if (d[e[j].u] < inf)
if (d[e[j].v] > d[e[j].u] + e[j].w) {
d[e[j].v] = d[e[j].u] + e[j].w;
any = true;
}
if (!any) break;
}
cout << d[d.size()-1] << endl;
}
int main() {
cin >> n >> m;
edge t;
for (i = 0; i<m; i++)
{
cin >> t.u >> t.v >> t.w;
t.u--; t.v--;
e.push_back(t);
}
solve();
}
从数学的角度来看,如果用一对方向相反的有向边替换每个无向边,则无向图应该等价于有向图。
据我所知,您正在尝试实现贝尔曼-福特算法。有关您的实施的一些说明。如我所见,您的v
全局变量未正确初始化。这是故意假设源是索引为 0 的顶点吗?贝尔曼-福特找到从源到所有其他顶点的最短路径;您输出具有最大索引的顶点路径的长度,这是您所期望的吗?
一个主要问题:如果你有一个负循环(这是可能的,因为你使用有符号的int来存储权重)会发生什么?贝尔曼-福特算法的好处是,如果图形的某些边具有负权重,它就可以正常工作。此外,它允许您检测负循环的存在,但在您的情况下,算法将进入无限循环。解决方案是用n
限制迭代次数;如果在第 n 次迭代中,您发现您仍然没有离开循环,则您的图形中存在一个负循环。
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- Boost Graph Library,修复节点大小
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 如何修复函数样式强制转换或类型构造的预期"("?
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 当使用带有VS2019或VSCode的虚幻引擎4.24.2时,我如何修复这些错误的Intellisense错误
- 如何修复sfml c++代码编译错误
- Python中的for循环与C++有何不同
- 如何修复此iFile以将.txt输出到控制台
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 如何修复此错误:className::className的无效使用
- 叮叮当当在修复时插入多个"覆盖"说明符
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 如何修复 Onnx运行时会话>运行问题?
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 如何修复编译器警告 C6386 和 C6385?
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- 如何修复"error: ‘_1’ was not declared in this scope"?