(算法设计技巧与分析)Dijkstra
来源:互联网 发布:交朋友的软件 编辑:程序博客网 时间:2024/06/08 14:16
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;//算法初始化page148r=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;}
0 0
- (算法设计技巧与分析)Dijkstra
- 015-Dijkstra算法-贪心-《算法设计技巧与分析》M.H.A学习笔记
- (算法设计技巧与分析)LinearSearch
- (算法设计技巧与分析)BinarySearch
- (算法设计技巧与分析)Merge
- (算法设计技巧与分析)SelectSort
- (算法设计技巧与分析)InsertionSort
- (算法设计技巧与分析)SelectionSortFec
- (算法设计技巧与分析)InsertionSort
- (算法设计技巧与分析)RadixSort
- (算法设计技巧与分析)Exprec
- (算法设计技巧与分析)Permutationsi
- (算法设计技巧与分析)Majority
- (算法设计技巧与分析)MinMax
- (算法设计技巧与分析)BinarySearchrec
- (算法设计技巧与分析)MergeSort
- (算法设计技巧与分析)QuickSort
- (算法设计技巧与分析)CloseStpair
- IOS 自定义控件之-显示下载过程的ImageView
- android sqlite多线程读写分析与优化
- Git学习[二]
- 文章标题
- 笔试题目总结1
- (算法设计技巧与分析)Dijkstra
- C/C++面试总结必考题
- java深入分析I/O流工作机制01-写在分析之前
- 如何使VVdocumenter支持Xcode6
- iOS 自动布局 Auto Layout 入门 04 约束的动态效果
- poj_3020
- C/C++面试总结必考题 2
- [数据库]MySQL索引背后的数据结构及算法原理
- c++关键字explicit