【问题标题】:To determine whether there is a path between two points using C++ or C [closed]使用 C++ 或 C 确定两点之间是否存在路径 [关闭]
【发布时间】:2012-08-12 02:33:05
【问题描述】:

我有一个由邻接矩阵表示的无向图。

我需要一个高效的代码,函数只需要返回真或假。

而且我知道Dijkstra's algorithm可以工作,我想我不需要最短路径,我的邻接矩阵是:

a[i][j] = 1 or -1

没有其他值。

【问题讨论】:

  • 本题需要添加算法标签
  • 有 BFS(广度优先搜索)和 DFS(深度优先搜索)算法可以满足您的需求。看看那些。

标签: algorithm graph-algorithm shortest-path


【解决方案1】:

抱歉,我没有注意到你的矩阵只包含 0 和 1。

如果只查询一次,也许DFS或BFS更好,只有O(|V|+|E|)

如果是双向路径,Disjoint-set data structure(See wikipedia) 有效!

  • 单源还是多源?
  • 单查询还是多查询?

如果只有一个查询,所有单源最短路径算法都可以。喜欢:

  • 贝尔曼福特O(|V||E|)
  • 迪克斯特拉O(|V|^2)
  • Dijkstra + 堆 Θ((|E|+|V|)log|V|)
  • SPFA(贝尔曼-福特使用队列)
  • ...

如果有很多查询,考虑

  • 弗洛伊德-沃歇尔算法O(|V|^3)

【讨论】:

  • 一个查询和双向路径。
  • DFSBFS 的最坏情况是 O(|E| + |V|)
  • @DougRamsey 感谢您指出我的错误。
【解决方案2】:

如果您只需要知道两点是否连接,我认为http://en.wikipedia.org/wiki/Disjoint-set_data_structure 会尽快完成这项工作。从它自己的集合中的每个点开始,然后对于两个点之间的每个链接,连接这些点所属的两个集合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2021-03-04
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多