使用 Dijkstra 算法寻找最短路径

2023-11-27

我需要找到图的两个顶点之间的最短路线。我有一个矩阵,其中包含所有权重。我该怎么做?目前,我有以下代码:

private int[] Dijkstra(int start, int end)
    {
        bool[] done = new bool[8];
        int[] parent = new int[8];
        for (int i = 0; i < parent.Length; i++)
            parent[i] = -1;
        int[] distances = new int[8];
        for (int i = 0; i < distances.Length; i++)
            distances[i] = int.MaxValue;
        distances[start] = 0;
        int current = start;
        while (!done[current])
        {
            done[current] = true;
            for (int i = 0; i < 8; i++)
            {
                if (graph[current, i] != int.MaxValue)
                {
                    int dist = graph[current, i] + distances[current];
                    if (dist < distances[i])
                    {
                        distances[i] = dist;
                        parent[i] = current;
                    }
                }
            }
            int min = int.MaxValue;
            for (int i = 0; i < 8; i++)
            {
                if (distances[i] < min&&!done[i])
                {
                    current = i;
                    min = distances[i];
                }
            }
        }
        return parent;
    }

它可以工作,但是,我不知道如何让它找到 1 和 3 之间的最短路线,并返回 1=>4=>2=>3 这样的路线。
提前致谢。


Dijkstra 算法使用父数组来跟踪从开始到结束的最短路径。您将从parent[end] 开始并跟踪数组的条目,直到回到开始为止。

一些伪代码:

List<int> shortestPath = new List<int>();
int current = end;
while( current != start ) {
     shortestPath.Add( current );
     current = parent[current];
}

shortestPath.Reverse();

对于函数,您唯一需要担心的是传入的开始值和结束值是否是适当的值(例如,它们是否实际上代表图形中的顶点)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Dijkstra 算法寻找最短路径 的相关文章

  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • 当其源是 https uri 时如何使 wpf MediaElement 播放

    在 wpf 独立应用程序 exe 中 我在主窗口中包含了 MediaElement
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • 为什么 C# 中同一类型的隐式和显式运算符不能共存? [复制]

    这个问题在这里已经有答案了 为什么同一类中两个相同类型的运算符 显式和隐式 不能共存 假设我有以下内容 public class Fahrenheit public float Degrees get set public Fahrenhe
  • 类中是否可以有虚拟类声明?

    我正在为个人项目中框架的各个组件设置一个接口 我突然想到了一些我认为可能对接口有用的东西 我的问题是这是否可能 class a public virtual class test 0 class b public a public clas
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • 在 C 语言中替换宏内的宏

    我正在尝试使代码部分可重用 我下面的评论片段没有达到我想要的效果 define NAME ABC define LOG SIZE NAME LEN 我想LOG SIZE决心ABC LEN 我尝试过使用 但没能让它发挥作用 LOG SIZE在
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • 不使用放置 new 返回的指针时的 C++ 严格别名

    这可能会导致未定义的行为吗 uint8 t storage 4 We assume storage is properly aligned here int32 t intPtr new void storage int32 t 4 I k
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request
  • Emacs C++,打开相应的头文件

    我是 emacs 新手 我想知道 是否有在头文件 源文件和相应的源文件 头文件之间切换的快捷方式 是否有像通用 emacs 参考卡那样的参考卡 Thanks There s ff find other file 您可以使用以下方法将其绑定到

随机推荐

  • 什么是头文件和库文件? [复制]

    这个问题在这里已经有答案了 可能的重复 头文件和库有什么区别 谁能告诉我头文件和库文件的实际含义是什么以及它们的区别 例如 我们在程序中包含扩展名为 h 的头文件 它只是定义 但实际的实现是在库文件中定义的 这是在链接阶段完成的 这就是人们
  • C# 中 ++i 与 i += 1 有性能差异吗?

    i a 应等于 i i a 在 a 1 的情况下 据说它的效率不如 i 因为它涉及更多的内存访问 或者编译器会让它与 i 完全相同吗 答案很简单 C 编译器将 C 源代码转换为 IL 操作码 没有专用的 IL 操作码可以执行与 运算符等效的
  • 存储为 BINARY XML 时 Oracle XMLType 有多大

    Oracle 文档声称它将 XMLType 存储为 BINARY XML 比存储为 CLOB 更紧凑 但是我如何知道二进制 xml 占用了多少空间呢 CREATE TABLE t x XMLTYPE XMLTYPE x STORE AS B
  • logback - 重新映射特定记录器的日志级别

    我有一个 logback 配置 其中有一个带有阈值过滤器的附加程序
  • 如何在react中设置cookie?

    本来我是用下面的ajax来设置cookie的 function setCookieAjax ajax url Web Servlet setCookie contentType application x www form urlencod
  • 使用 Javascript 将 XML 转换为 CSV

    我正在寻求一些帮助 尝试将从 Amazon Product API 检索到的 XML 转换为 CSV 逗号分隔值 格式 我在这里找到了类似的主题 XML 到 CSV 转换问题但它使用 PHP 我想使用 javascript 这是我所拥有的示
  • 模型 Score() 与 r2_score 之间的差异

    我正在训练 Linear Regression 分类器并尝试衡量其预测准确性 from sklearn metrics import r2 score from sklearn linear model import LinearRegre
  • Pandas Dataframe 滚动两列和两行

    我得到了一个包含两列的数据框 其中包含经度和纬度坐标 将 pandas 导入为 pd values Latitude 0 47 021503365600005 1 47 021503365600005 2 47 02150336560000
  • 在 MVC 3 Razor 中显示上传的图像

    好吧 这个新手在显示上传到服务器的图像时犯了一些错误 model public class Person public int ID get set public string Name get set public string Imag
  • 如何在模态对话框中设置输入值?

    我正在研究 添加链接 功能 为此我正在使用来自 Twitter Bootstrap JS 的模态插件 在主页上只有 链接 字段需要填写 当用户单击 添加链接 按钮时 会弹出一个模式 用户会看到填写 3 个字段的完整表单 链接 标题 标签 但
  • 找到接口 org.apache.poi.util.POILogger,但类是预期错误

    public String readExcel String columnname String UserType try FileInputStream file new FileInputStream path SuppressWarn
  • require() 实际上返回什么,文件还是函数

    例如 我有 profile js var EventEmitter require events EventEmitter var https require https var http require http var util req
  • Java BigDecimal:四舍五入到最接近的整数值

    我需要以下结果 100 12 gt 100 00 100 44 gt 100 00 100 50 gt 101 00 100 75 gt 101 00 round or setScale 我该怎么办 您可以使用setScale 将小数位数减
  • 我正在运行什么 GCD 队列(无论是主队列还是非队列)?

    我正在尝试编写一些线程安全的方法 所以我使用 dispatch queue t main dispatch get main queue dispatch sync main self doSomethingInTheForeground
  • Accepts_nested_attributes_for:我做错了什么

    我尝试在rails4中创建一对多连接 但是 虽然我没有收到错误 但嵌套属性未存储 我究竟做错了什么 车站模型 class Station lt ActiveRecord Base has many adresses accepts nest
  • 更改 DEFAULT_AUTO_FIELD 时迁移依赖项模型

    我正在使用 Django 3 2 我已更改将此行添加到settings py DEFAULT AUTO FIELD django db models BigAutoField 然后我运行这些命令 python manage py makem
  • 创建满足给定条件的连续天数组

    我在 SQL Server 中有以下数据结构表 ID Date Allocation 1 2012 01 01 0 2 2012 01 02 2 3 2012 01 03 0 4 2012 01 04 0 5 2012 01 05 0 6
  • 引起一致 GC 流失的技术

    我正在寻找基准测试 同时应对大量正在进行的垃圾收集 我之前已经对其在稳定的单线程运行中的行为进行了基准测试 现在我想在压力更大的 JVM 中进行相同的测试 本质上 我希望后台线程以相当一致的速度创建和销毁对象 我正在寻找有关如何实现稳定但
  • git 子模块到底是如何工作的

    The gitmodulefile 仅指定模块存储库 url 如何git submodule知道要下载哪个版本吗 它似乎总是检查最新版本 那么 开发者如何保证主项目和子模块之间的兼容性呢 您的子模块被表示为具有特殊模式的特殊条目 称为git
  • 使用 Dijkstra 算法寻找最短路径

    我需要找到图的两个顶点之间的最短路线 我有一个矩阵 其中包含所有权重 我该怎么做 目前 我有以下代码 private int Dijkstra int start int end bool done new bool 8 int paren