(算法设计技巧与分析)Dijkstra
2015-03-10 22:31
435 查看
Dijkstra.cpp
#include"GraphList.h" #include<iostream> using namespace std; int main() { GraphList gl; gl.Initialize(); Dijkstra(gl); return 0; }
GraphList.h
#include<iostream> using namespace std; struct Edge { Edge(){dest=-1;weight=-1;link=0;} Edge(int d,int w,Edge*l){dest=d;weight=w;link=l;} int dest;//另一顶点的位置 int weight;//权重 Edge*link;//下个链 }; struct Point { Point(){next=0;} Point(int d,Edge*n){data=d;next=n;} int data;//顶点位置 Edge*next; }; struct GraphList { void Initialize();//初始化 Point*root;//邻接表 int PointCount;//顶点数目 }; struct dijkstra { int p;//结点名字 int w;//结点权重 bool flag;//是否已经走过该结点 }; void GraphList::Initialize() { Edge*r; PointCount=6; root=new Point[PointCount]; for(int i=0;i<PointCount;i++) root[i].data=i+1; //算法初始化page148 r=new Edge(1,9,0);r->link=root[0].next;root[0].next=r; r=new Edge(2,4,0);r->link=root[0].next;root[0].next=r; r=new Edge(3,12,0);r->link=root[1].next;root[1].next=r; r=new Edge(4,5,0);r->link=root[1].next;root[1].next=r; r=new Edge(1,4,0);r->link=root[2].next;root[2].next=r; r=new Edge(4,13,0);r->link=root[2].next;root[2].next=r; r=new Edge(5,2,0);r->link=root[3].next;root[3].next=r; r=new Edge(3,3,0);r->link=root[4].next;root[4].next=r; r=new Edge(5,15,0);r->link=root[4].next;root[4].next=r; } void Dijkstra(GraphList gl) { dijkstra *d;//存放最短路径的数组 int change;//存放当前路径最小点的下标 Edge*next_point;//查询链表指针 int i,j; d=new dijkstra[gl.PointCount+1]; for(i=1;i<gl.PointCount+1;i++)//初始化 { d[i].p=i+1; d[i].w=99999; d[i].flag=false; } d[0].p=1;d[0].w=0;d[0].flag=true;//初始化开始点 next_point=gl.root[0].next; while(next_point)//找与开始点相邻结点 { d[next_point->dest].p=gl.root[next_point->dest].data; d[next_point->dest].w=next_point->weight; next_point=next_point->link;//找下一结点 } for(i=1;i<gl.PointCount;i++)//一共要找PointCount-1个结点 { change=gl.PointCount; for(j=1;j<gl.PointCount;j++) { if(d[j].flag==false&&d[j].w<d[change].w)//找权重最小且没有走过的结点 {change=j;} } d[change].flag=true;//改标志 next_point=gl.root[change].next; while(next_point)//修改权重 { if(d[next_point->dest].flag==false&&(d[change].w+next_point->weight<d[next_point->dest].w)) d[next_point->dest].w=d[change].w+next_point->weight; next_point=next_point->link; } } for(i=0;i<gl.PointCount;i++) cout<<d[i].p<<" "<<d[i].w<<endl; }
相关文章推荐
- (算法设计技巧与分析)LinearSearch
- (算法设计技巧与分析)SelectSort
- (算法设计技巧与分析)LCS
- 算法设计技巧和分析学习笔记1 (归纳法、分治和动态规划)
- (算法设计技巧与分析)Kruskal
- (算法设计技巧与分析)BinarySearch
- (算法设计技巧与分析)MinMax
- (算法设计技巧与分析)matchain
- (算法设计技巧与分析)MergeSort
- 算法分析与设计课程设计-Dijkstra最短路径算法
- (算法设计技巧与分析)InsertionSort
- <算法设计技巧与分析>M.H>Alsuwaiye编著 读书心得
- (算法设计技巧与分析)SelectionSortFec
- (算法设计技巧与分析)floyd
- (算法设计技巧与分析)QuickSort
- (算法设计技巧与分析)InsertionSort
- (算法设计技巧与分析)Exprec
- (算法设计技巧与分析)Permutationsi
- (算法设计技巧与分析)prim
- (算法设计技巧与分析)Knapsack