【问题标题】:How to fix a directed graph on undirected?如何在无向图上修复有向图?
【发布时间】:2019-10-22 12:27:41
【问题描述】:

我无法正确更正代码,导致图形无向。通过输入,通过条件,应该有一些顶点,边,然后是相邻顶点的列表及其权重

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

【问题讨论】:

  • 如果您说明算法应该做什么以及卡在哪里,这将有所帮助。我猜这是某种最短路径?就个人而言,我不喜欢单字母变量名,因为它们使代码在大多数情况下极难阅读。一个简单的解决方法是在读取输入边时也添加反向边。
  • 很难理解你的问题是什么。由于您没有提供任何示例数据,因此人们也很难重新创建。请参考How to create a minimal, recreateable example

标签: c++ algorithm path bellman-ford shortest


【解决方案1】:

从数学的角度来看,如果将每条无向边替换为一对方向相反的有向边,则无向图应该等价于有向图。

据我所知,您正在尝试实现 Bellman-Ford 算法。关于您的实施的一些说明。如我所见,您的 v 全局变量未正确初始化。是否有意假设源是索引为 0 的顶点? Bellman-Ford 找到从源点到所有其他顶点的最短路径;您输出到具有最大索引的顶点的路径长度,这是您所期望的吗?

一个主要问题:如果你有一个负循环会发生什么(这是可能的,因为你使用有符号的 int 来存储权重)? Bellman-Ford 算法的好处是,如果图的某些边具有负权重,它可以正常工作。此外,它允许您检测负循环的存在,但在您的情况下,算法将进入无限循环。解决方法是用n限制迭代次数;如果在第 n 次迭代中你发现你还没有离开循环,那么你的图中就有一个负循环。

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    相关资源
    最近更新 更多