Dijstra算法代码描述

来源:互联网 发布:百分百综合采集软件 编辑:程序博客网 时间:2024/06/10 18:19

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

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

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

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

#include<iostream>#include<string>using namespace std;/*邻接矩阵的类型定义*/#define MAX 10000000#define MAX_VERTEX_NUM 20typedef 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;//将矩阵初始化为MAXfor(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字符数组中,表示路径elsepath[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数组中最小值的位置kcout<<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到各个点的最短路径及路径长度。

0 0