贪心算法-单源最短路径
2013-10-21 23:50
211 查看
算法流程:
(a) 初始化:用起点v到该顶点w的直接边(弧)初始化最短路径,否则设为∞;
(b) 从未求得最短路径的终点中选择路径长度最小的终点u:即求得v到u的最短路径;
(c) 修改最短路径:计算u的邻接点的最短路径,若(v,…,u)+(u,w)<(v,…,w),则以(v,…,u,w)代替。同时,用path记录每个节点最短路径的前导节点。
(d) 重复(b)-(c),直到求得v到其余所有顶点的最短路径。
一共有N个节点,出发结点为V0,需要一个一维数组path
来记录前一个节点序号,一个一维数组dist
来记录从原点到当前节点最短路径(初始值为V0到Vi的边的权值,没有则为+∞,这里用MAX=65536来代替无穷大),一个二维数组cost
来记录各点之间边的权重,按以上流程更新path
和dist
。
测试:
测试用例用的是课件的例子,总共有7个节点,打印从节点1到别的节点的最短路径。
输出路径,主要用递归输出,printpath打印每个节点的前面的节点,直至到第一个节点。
(a) 初始化:用起点v到该顶点w的直接边(弧)初始化最短路径,否则设为∞;
(b) 从未求得最短路径的终点中选择路径长度最小的终点u:即求得v到u的最短路径;
(c) 修改最短路径:计算u的邻接点的最短路径,若(v,…,u)+(u,w)<(v,…,w),则以(v,…,u,w)代替。同时,用path记录每个节点最短路径的前导节点。
(d) 重复(b)-(c),直到求得v到其余所有顶点的最短路径。
一共有N个节点,出发结点为V0,需要一个一维数组path
来记录前一个节点序号,一个一维数组dist
来记录从原点到当前节点最短路径(初始值为V0到Vi的边的权值,没有则为+∞,这里用MAX=65536来代替无穷大),一个二维数组cost
来记录各点之间边的权重,按以上流程更新path
和dist
。
测试:
测试用例用的是课件的例子,总共有7个节点,打印从节点1到别的节点的最短路径。
输出路径,主要用递归输出,printpath打印每个节点的前面的节点,直至到第一个节点。
#include <iostream> using namespace std; //点的个数大小 #define N 7 //用MAX表示无穷大 #define MAX 65536 /* G是一个N结点有向图,它由其成本邻接矩阵cost(n,n)表示DIST(j)被置 以结点v到结点j的最短路径长度,这里1≤j≤n。DIST(v)被置成零,path 用于记录路径 */ void SHORTEST_PATHS(int v,int cost ,int dist ,int path[6],int n) { //visit数组,记录访问过的节点,访问过置为1,否则置为0 //初始化全为0 int visit = {0}; for(int i=0;i<N;++i) { //别的点到V0点的初始化距离 dist[i] = cost[0][i]; //path数组用于记录路径,记录前面的节点 if(dist[i] != MAX) path[i] = 0; } //将V0点置为1表示访问过 visit[0] = 1; dist[0] = 0; for(int i=1;i<N;++i) { int u; int temp = MAX; for(int j=0;j<N;++j) { if(visit[j]==0 && dist[j]<temp) { //u用来记录下一个被选入集合S的点 u = j; temp = dist[j]; } } visit[u] = 1; //更新所有点的距离 for(int j=0;j<N;++j) { if(visit[j] == 0) { //如果加入的点使得距离变小了,就更新 int newdist = dist[u]+cost[u][j]; if(newdist < dist[j]) { dist[j] = newdist; path[j] = u; } } } } } //递归打印路径 void printpath(int path[],int end) { if(end == 0) return; printpath(path,path[end]); printf("V%d",path[end]); } int main() { //测试用例,来自课件 int cost = {{0,20,50,30,MAX,MAX,MAX}, {MAX,0,25,MAX,MAX,70,MAX}, {MAX,MAX,0,40,25,50,MAX}, {MAX,MAX,MAX,0,55,MAX,MAX}, {MAX,MAX,MAX,MAX,0,10,70}, {MAX,MAX,MAX,MAX,MAX,0,50}, {MAX,MAX,MAX,MAX,MAX,MAX,0}, }; int dist ; int path ; SHORTEST_PATHS(0,cost,dist,path,N); cout<<"start\tend\tlength\tnodes list"<<endl; //格式化输出 for(int i=1;i<N;++i) { cout<<"V0\tV"<<i<<"\t"<<dist[i]<<"\t"; printpath(path,i); cout<<"V"<<i<<endl; } return 0; }
相关文章推荐
- 贪心算法之最小生成树prim与单源最短路径dijkstra
- 0024算法笔记——【贪心算法】单源最短路径问题
- 算法笔记——【贪心算法】单源最短路径问题
- 贪心算法解决单源最短路径问题
- 贪心算法 Dijkstra 单源最短路径
- 贪心算法 - 单源最短路径 Dijkstra
- 贪心算法 - 单源最短路径 Dijkstra
- 贪心算法——单源最短路径
- Dijkstra算法是解单源最短路径问题的一个贪心算法
- 贪心算法之单源最短路径
- 贪心算法——单源最短路径 dijkstra
- 贪心算法之单源最短路径Dijkstra
- 贪心算法--Dijkstra算法(单源最短路径算法)
- 贪心算法之单源最短路径
- 0024算法笔记——【贪心算法】单源最短路径问题
- 带负权图的单源最短路径算法:Bellman-Ford算法
- 图之单源Dijkstra算法、带负权值最短路径算法
- 算法导论 第二十四章:单源最短路径
- [算法导论] 单源最短路径 - Dijkstra 学习笔记
- 图算法 单源最短路径 Bellman_Ford算法(边权值为负情况)