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

C++ Dijkstra Algorithm - print edge name/type

本文关键字:类型 边缘 打印 Dijkstra 算法      更新时间:2023-10-16

我目前正在处理Dijkstra的最短路径问题。我在这个项目中没有什么具体的,算法是标准的(配对组合),除了我需要将边缘类型从一个顶点打印到另一个顶点。

想象我有4个顶点和5个边缘。存在一对顶点P(V1,V2),因此连接V1和V2有2个或更多边。例如,我们想找到从伦敦到巴黎的距离。我们知道我们俩都可以乘汽车开车(一种边缘),也可以购买机票(另一种边缘)。我想做的是打印边缘的类型。

示例:我有两种从伦敦到达巴黎的方法:伦敦 ->加来 ->巴黎,最小时间5小时,开车;伦敦 ->巴黎,最小时间1小时,飞机。

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

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

但是,我还是不知道,计算最短路径时如何存储这些边缘的"类型"。

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

您已经有了此信息,它存储在prev_type[x]数组中。此数组包含您用于达到最终节点ttransport的类型。它与纪念父节点的数组prev[]或您到达当前的节点的节点结合起作用。因此,您从t(最终节点)开始,并致电prev[t],以获取其父,而prev_type[t]将包含用于达到t的运输类型。继续这样做,直到到达s(start)节点。

解决了这个问题,从一个城市到另一个城市(基本上 - 城市的所有组合)。

 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 =我们要去的目的地。

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