C Dijkstra算法 - 打印边缘名称/类型
C++ Dijkstra Algorithm - print edge name/type
我目前正在处理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]
数组中。此数组包含您用于达到最终节点t
的transport
的类型。它与纪念父节点的数组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 =我们要去的目的地。
我确信该解决方案不是最好的解决方案,但是对于这种特定情况,少量的节点和边缘是适用的。
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- ffmpeg/opencv 如何在分类后执行边缘检测 帧的类型
- C Dijkstra算法 - 打印边缘名称/类型
- 提升图形库:获取edge_descriptor或通过 int 类型的索引访问边缘
- 使用基本类型标记的增强图边缘的简单点输出