您的位置:首页 > Web前端 > JavaScript

Dijstra算法代码描述

2016-07-20 15:35 441 查看
图论学过很多次的最短路问题,其中Dijstra算法是一个经典的解决求图中某一点到其他所有点的算法,思想理解了很多遍,但是不知道代码怎么写!

如果要理解算法的话网上很多博客都有讲的,这里把代码和运行过程来分享一下。

代码是根据http://blog.csdn.net/hackerain/article/details/6055925稍加修改的,原文是使用文件读写,但是没有把文件贴出来,这里我自己画了一张图,采用标准输入(键盘输入),最终打印出路径和路径长度。

此图有6个顶点,十条边。依次输入图的信息。



#include<iostream>
#include<string>
using namespace std;
/*邻接矩阵的类型定义*/
#define MAX 10000000
#define MAX_VERTEX_NUM 20
typedef struct
{
string vexs[MAX_VERTEX_NUM];//用一维数组存储顶点信息
int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//用二维数组充当矩阵,来存储顶点边的信息
int vexnum,edgenum;//顶点树和边数
}MGraph;
/*构造有向网的邻接矩阵*/
void CreateDN_AM(MGraph &G,int n,int e)
{
G.vexnum=n;
G.edgenum=e;

int i,j,k;
int weight;
for(i=0;i<n;i++){
cout<<"请输入第"<<i+1<<"顶点信息:";
cin>>G.vexs[i];//输入顶点信息
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
G.edges[i][j]=MAX;//将矩阵初始化为MAX
for(k=0;k<e;k++)
{
cout<<"依次输入第"<<k+1<<"边的顶点,终点,权值:";
cin>>i>>j>>weight;
G.edges[i][j]=weight;
G.edges[j][i]=weight;
}
}
/*迪杰斯特拉算法求某个顶点到其余顶点的最短路径*/
void ShortestPath_DJ(MGraph &G,int v)
{
int i,j,k,min;
int final[MAX_VERTEX_NUM];//该数组用来标识顶点是否已确定了最短路径
int dist[MAX_VERTEX_NUM];
string path[2*MAX_VERTEX_NUM];
for(i=0;i<G.vexnum;i++)
{ //初始化工作
dist[i]=G.edges[v][i]; //dist数组用来存储当前找到的v到其他各顶点的最短路径
if(dist[i]<MAX)
path[i]=G.vexs[v]+G.vexs[i];//如果v到i有边的话,把顶点字符存到path字符数组中,表示路径
else
path[i]="";
final[i]=0;//初始化标识数组为0
}
dist[v]=0;
final[v]=1;
for(j=1;j<G.vexnum;j++)
{
min=MAX;
for(i=0;i<G.vexnum;i++)
if(dist[i]<min && final[i]==0)
{
min=dist[i];
k=i;
}//找到dist数组中最小值的位置k
cout<<path[k]<<" "<<dist[k]<<endl;//输出最短路径
final[k]=1;//设置标志位
for(i=0;i<G.vexnum;i++)
{//遍历每个顶点i和当前的已求出的最短路径的顶点k作比较,若从源点经过顶点k到顶点i的路径,比dist[i]小,
//则更新顶点dist[i]
if(dist[i]>dist[k]+G.edges[k][i] && final[i]==0)
{
dist[i]=dist[k]+G.edges[k][i];
path[i]=path[k]+G.vexs[i];
}
}//从整体上来看就是算出k的邻接点的当前最短路径
}
}
int main()
{
MGraph G;
CreateDN_AM(G,6,10);
ShortestPath_DJ(G,0);
}


运行结果如图所示,最终输出A到各个点的最短路径及路径长度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: