获取最近的路径图
Get the closest path graph
我有一个定向图哪里
1 - From
2 - To
3 - Start time (HH:mm, casted to integer) 60 => 01:00
4 - difference between endtime, always > 0;
1 2 60 120
1 2 720 125
1 2 900 120
1 3 390 90
1 3 1040 95
2 3 780 180
2 3 1260 180
2 4 240 240
2 4 300 240
2 4 1080 240
3 1 165 90
3 1 1430 90
3 2 1432 180
3 5 1431 249
4 2 1080 240
4 3 720 60
让我们忘记开始时间列,但是获得最接近路径的最简单算法是什么,从 1 到 5,这意味着,通过获取最接近的路径,其中第四列总和是较小的一。
值得一提的是:我没有真正的节点,我只有关于边缘的信息,我正在以数组形式编写,例如
edges[ ''counter'' ] [0] = from;
edges[ ''counter'' ] [1] = to;
edges[ ''counter'' ] [2] = timeToInt(time);
edges[ ''counter'' ] [3] = timeToInt(endTime) - edges[ ''counter'' ] [2];
我听说过Dijkstra算法,但是如何实现。
你的编程语言在这里无关紧要,这纯粹是一个算法问题。您的一些不错的选择包括:
- Dijkstra 算法,如果所有边都有非负成本,如您的示例所示。Dijkstra的很快,而且相当容易实现。Boost中有一个实现,谷歌搜索应该会出现很多实现。
- A*,这真的是Dijkstra的各种。甚至更快,但启发式,所以可以提供一种不是最好的解决方案,而且可能更难实现。我强烈建议在实现基本Dijkstra之后的某个时候实现A*作为练习。再一次,A*存在于Boost中。
- 贝尔曼-福特,如果您需要扩展到负边缘权重。也出现在 Boost 中,只是稍微困难了一点。
我误解了规则,我必须乘坐每一个可能的航班......
// lets find all airports which allows flights from home city and so on..
int min;// minimum value
int minc;// minimal coordinate
int mine;//real position of edge in array
int fakehome = 0;// temprorary position for house
int lastmine = -1;//last position, so can compare times
//cout << timeToInt(begintime);
cout << home << " " << begintime<< endl;
fout << home << " " << begintime<< endl;
while(home != aim)// loop while we havent reached aim/target airport
{
min = 1440;// 24(hours) * 60 is unreachable value, so 1440 minuts ok
minc = ports;// max could be count(of airports)
mine = edges_counter;// array position of edge
//lastmine = -1;
for(int i =0;i< edges_counter;i++)
{
//if(edges[i][0] == home) cout << edges[i][0] << " " << edges[i][1] << " " << edges[i][2] << " " << edges[i][3] << " " << endl;
if(min > edges[i][2] && edges[i][0] == home && edges[i][4] == 0)
{
if(lastmine != -1 && (edges[lastmine][2]+edges[lastmine][3]) < edges[i][2])
{
min = edges[i][2];
minc = edges[i][1];
mine = i;
fakehome = edges[i][1];
}
else if(lastmine == -1 && timeToInt(saklaiks) < edges[i][2])
{
min = edges[i][2];
minc = edges[i][1];
mine = i;
fakehome = edges[i][1];
}
}
}
if(mine != edges_counter)
{
//cout << setw(3) << mine << " ";
intToTime(edges[mine][2],time);
cout << home << "->" << fakehome << " " << time;
fout << home << "->" << fakehome << " " << time;
intToTime((edges[mine][2]+edges[mine][3]), time);
cout << "-" << time<< endl;
fout << "-" << time<< endl;
intToTime((edges[mine][2]+edges[mine][3]),begintime);
home = fakehome;
edges[mine][4] = 1;
}
lastmine = mine;
}
但是有一个问题..
如果
为飞行和无法达到目标给出无限循环。如何检查?
If is given
3 (how much airports)
1 3 (have to go from 1 to 3)
00:00 (start time)
1 2 01:00-02:00 (from 1 to 2 there is flight that takes 1 hour)
2 1 03:00-04:00 (from 2 to 1 there's also flight that takes 1 hour)
2 3 12:00-13:00 (...)
但是2->3永远不会达到,因为2->1飞行比2->3更快任何在打印第一个元素之前知道循环的想法,因为它正在打印
1->2 ...
2->1 ...
1->2 ...
等等..我必须打印:"不可能"。
相关文章:
- 如何将更多文件夹添加到c++include路径
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- C++A*算法并不总是在路径中具有目标节点
- 从函数角度看ID到文件路径的内部与外部映射
- boost xml parsingl将xml的路径作为变量发送
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- 如何使用cppcheck处理半相对包含路径
- 在C++中设置基于操作系统的文件路径
- 查找最近配对时的OpenMP竞赛条件
- 基于编译器选项的编译二进制路径
- 按边长度递归搜索图中所有可行路径
- 使用变量值作为 PlaySound 中的路径
- 如何获取pcl迭代最近点(ICP)的迭代点数?
- 如何转换真实路径 CString c++
- 从 GUID 获取 USB 卷路径
- 查找 GCD:并非所有控制路径都返回值
- C++17 文件系统::remove_all 带有通配符路径
- 我最近更改了编译器路径以运行 c++ 代码,但现在我无法运行任何 python 代码。我该如何解决这个问题?
- 获取最近的路径图
- 具有最近路径前缀回退的查找树