Dijstra算法代码描述

图论学过很多次的最短路问题,其中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到各个点的最短路径及路径长度。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值