(算法设计技巧与分析)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