Dijkstra及Floyd在多关键字(有主次顺序)约束下的最优路径
来源:互联网 发布:php 表单 编辑:程序博客网 时间:2024/06/11 02:18
以第一个关键字作为约束,用Floyd算法求解出多条最优的路径,再以第二个关键字作为约束,进一步筛选出最优的路径。
比如:第一关键字为距离,第二关键字为花费。
思路:将Floyd算法中的路由矩阵的每个元素设置为vector,当出现:dist[i][j] == dist[i][k] + dist[k][j]时,将该k压入vector的router[i][j]位置最后遍历这些路径使用递归函数
关键代码片段
for (int k = 0; k < n; k++){for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (Graph[i][k] <= 0 || Graph[k][j] <= 0 || i == j) //以-1表征不相连接的边continue;if ((Graph[i][j] > 0 && Graph[i][j] > Graph[i][k] + Graph[k][j]) || (Graph[i][j] < 0)){Graph[i][j] = Graph[i][k] + Graph[k][j];Path[i][j].clear();//***Path[i][j].insert(Path[i][j].end(), Path[i][k].begin(), Path[i][k].end());//***}else if (Graph[i][j] == Graph[i][k] + Graph[k][j]){Path[i][j].insert(Path[i][j].end(), Path[i][k].begin(), Path[i][k].end());//***}}}}
//----------------------------------------------------------------------------------------------------------------------------------
对于Dijkstra算法,同理,求多关键字约束下的最优路径见题目:http://ac.jobdu.com/problem.php?pid=1008思路:在distance数组中挑选最小值以及更新辅助数组时,同时以這些关键字作为参考筛选。关键代码片段//其中Graph存储距离信息,为第一关键字,Pay为每条路径的花费信息,为第二关键字void Dijkstra(int **const Graph, int **Pay, int n, int source, int *distance, int *cost){bool *decided = new bool[n];//初始化三个矩阵decided、distance、costfor (int i = 0; i < n; i++){if (i == source)decided[i] = true;elsedecided[i] = false;distance[i] = Graph[source][i];cost[i] = Pay[source][i];}//n-1轮刷新距离矩阵for (int count = 1; count < n; count++) //需要n-1轮进行刷新{//找到最小权值的边,第一关键字为dist,第二关键字为costint minDist = MAX, minIndex = -1;for (int i = 0; i < n; i++){if (!decided[i] && distance[i] < minDist){minDist = distance[i];minIndex = i;}else if (!decided[i] && distance[i] == minDist){if (cost[i] < cost[minIndex])minIndex = i;}}decided[minIndex] = true;//一轮刷新for (int i = 0; i < n; i++){if (!decided[i]){if (distance[i] > minDist + Graph[minIndex][i]){distance[i] = minDist + Graph[minIndex][i];cost[i] = cost[minIndex] + Pay[minIndex][i];}else if (distance[i] == minDist + Graph[minIndex][i]){if (cost[i] > cost[minIndex] + Pay[minIndex][i]){cost[i] = cost[minIndex] + Pay[minIndex][i];}}}}}delete decided;}
1 0
- Dijkstra及Floyd在多关键字(有主次顺序)约束下的最优路径
- Dijkstra最优路径的算法
- Dijkstra最优路径的算法
- 最短路径下的Dijkstra算法和Floyd算法
- 图的最短路径(dijkstra算法/floyd算法)
- Dijkstra单源最短路径实现 及 Floyd任意两点之间的最短路径
- 最短带权路径问题的解法::Dijkstra & Floyd
- 最短路径:(Dijkstra & Floyd)
- 最短路径(Dijkstra、Floyd)
- 最短路径(Dijkstra和Floyd)
- 根据坐标行驶的距离算出最优路径Dijkstra(迪杰斯特拉算法)
- 有向图的最短路径(Floyd算法)
- 最短路径&&Dijkstra&&Floyd
- 图的最短路径算法(Dijkstra,Floyd)的实现
- C++编程练习(11)----“图的最短路径问题“(Dijkstra算法、Floyd算法)
- 最短路径的Floyd与Dijkstra算法
- 最短路径:Dijkstra,Bellman,SPFA,Floyd算法的实现
- 图的最短路径-Dijkstra和Floyd
- Min Stack
- 常用布局LinearLayout、RelativeLayout的特有属性
- Android设计模式 ~~~ 原型模式
- Android垃圾回收实质内容解析
- 人见人爱A^B
- Dijkstra及Floyd在多关键字(有主次顺序)约束下的最优路径
- java对象的强引用,软引用,弱引用和虚引用
- MySQL常用函数
- OC-UIKit-UILabel&第一个程序
- Jaxb将xml转换为bean时异常javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"
- 排序算法扫盲
- 08 ListView 优化
- Java(字节流的使用)
- Q67:机器人的运动范围