C++ Dijkstra 算法 - 打印边缘名称/类型

Posted

技术标签:

【中文标题】C++ Dijkstra 算法 - 打印边缘名称/类型【英文标题】:C++ Dijkstra Algorithm - print edge name/type 【发布时间】:2016-11-30 20:38:02 【问题描述】:

我目前正在研究 Dijkstra 的最短路径问题。我在这个项目中没有什么特别的,算法是标准的(用一组对实现),除了我需要打印从一个顶点到另一个顶点的边类型。

假设我有 4 个顶点和 5 个边。存在一对顶点 p(v1, v2),使得有 2 条或更多条边连接 v1 和 v2。例如,我们想找到从伦敦到巴黎的距离。我们知道我们都可以开车(一种边缘)或者我们可以买机票(另一种边缘)。我要做的是打印边缘的类型。

示例: 从伦敦到巴黎有两种方式: 伦敦 -> 加来 -> 巴黎,最少 5 小时车程; 伦敦 -> 巴黎,最少 1 小时,乘飞机。

我确切地知道,如何打印最短时间或最短距离,如何打印路径等。但是,我如何打印边缘类型(运输类型),例如“乘飞机”或“乘汽车” ?这是我尝试过的:

struct neighbor 

int target_vertex;
double weight;
int type;
// for type: 0 - car
// 1 - bus
// 2 - plane

;

但是,我仍然无法弄清楚,在计算最短路径时如何存储这些边缘“类型”。

此处代码:https://gist.github.com/anonymous/5943c448e47ebf0d3964baa53361459d

【问题讨论】:

【参考方案1】:

您已经拥有此信息,它存储在prev_type[x] 数组中。此数组包含您用于到达最终节点 ttransport 的类型。它与数组prev[] 结合使用,该数组记住父节点或您从中到达当前节点的节点节点。因此,您从t(最终节点)开始并调用prev[t],以获取其父节点,然后prev_type[t] 将包含用于到达t 的传输类型。继续以这种方式返回,直到到达 s(开始)节点。

【讨论】:

这是问题所在,它包含不存在的类型。例如,从一个城市到另一个城市的唯一方式是乘飞机(最短)。但它说->“巴士巴士飞机”【参考方案2】:

解决了问题,预先定义了所有可能的场景,从一个城市到另一个城市(基本上 - 城市的所有组合)。

 if (choice == 1) 
    switch (from) 
        case 0: 
            if (to == 1) std::cout << " by foot ";
            if (to == 2) std::cout << " by foot -> by bus ";
            if (to == 3) std::cout  << " by air ";
            break;
        
        case 1: 
            if (to == 0) std::cout << " by foot ";
            if (to == 2) std::cout << " by bus ";
            if (to == 3) std::cout << " by bus -> by car ";
            break;
        
        case 2: 
            if (to == 0) std::cout << " by bus -> by foot ";
            if (to == 1) std::cout << " by bus ";
            if (to == 3) std::cout << " by car ";
            break;
        
        case 3: 
            if (to == 1) std::cout << " by car -> by bus ";
            if (to == 2) std::cout << " by car ";
            if (to == 0) std::cout << " by air ";
        
    

from = 起始城市。

to = 我们要去的目的地。

我确信该解决方案不是最好的,但对于这种具有少量节点和边的特定情况,它是适用的。

【讨论】:

以上是关于C++ Dijkstra 算法 - 打印边缘名称/类型的主要内容,如果未能解决你的问题,请参考以下文章

用C或C++实现求最短路径的Dijkstra算法

为啥 Dijkstra 的算法不适用于负权重边缘?

用C++求dijkstra算法求最短路径

用 C++ 编写 Dijkstra 算法

[C++]单源最短路径:迪杰斯特拉(Dijkstra)算法(贪心算法)

Dijkstra算法与堆(C++)