您的位置:首页 > 其它

(算法设计技巧与分析)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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: