当前位置:   article > 正文

算法笔记 最短路径_dijkstra算法伪代码

dijkstra算法伪代码

最短路径

在这里插入图片描述

Dijkstra算法(迪杰斯特拉算法)

Dijkstra算法的伪代码:
在这里插入图片描述在这里插入图片描述

用领接矩阵实现Dijkstra算法 P371

C++中return 0;与return;的区别
[fill()函数的使用(a,a+10)C语言左闭右开)

const MAXV = 1000;		//最大顶点数
const INF = 1000000000;	//设INF为一个很大的数
  • 1
  • 2
int n,G[MAXV][MAXV];	// n为顶点数,MAXV为最大顶点数
int d[MAXV]; 			//起点到大各点的最短路径长度
bool vis[MAXV]={false};	//标记数组 vis[i]==true表示已访问。初值均为false

void Dijkstra(int s){	//s为起点 
	fill(d,d+MAXV,INF);		//fill函数将整个d数组赋为INF(慎用memset)
	d[s] = 0;				 // 起点s到自身的距离为0
	for(int i=0;i<n;i++)
	{
		int u=-1,MIN=INF; //u使d[u]最小,MIN存放该最小的d[u]
		for(int j=0;j<n;j++)	//找到未访问的顶点中d[]最小的 
		{
			if(vis[j] == false && d[j] < MIN)
			{
				 u=j;
				 MIN=d[j];
			 } 
		 } 
		 //找不到小于INF的d[u],说明剩下的顶点和起点s不连通
		 if(u == -1)
		 return;
		 vis[u] = true; 	//标记u为已访问
		 for(int v=0;v<n;v++) 	//如果v未访问&&u能到达v&&以u为中介点可以是d[v]更优 
		 {
		 	if(vis[v] == false && G[u][v] != INF && d[u] + G[u][v]<d[v])
		 	{
		 		d[v]=d[u]+G[u][v];		//优化d[v]	
			}

		  } 
	 } 
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

亚历山大的例子:
在这里插入图片描述
在这里插入图片描述

#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXV = 1000;		//最大顶点数
const int INF = 1000000000;	//设INF为一个很大的数(10^9) 或使用16进制0x3fffffff 表示不可达

int n,m,s,G[MAXV][MAXV];	// n为顶点数,m是边数,s是起点,MAXV为最大顶点数 
int d[MAXV]; 			//起点到各点的最短路径长度
bool vis[MAXV]={false};	//标记数组 vis[i]==true表示已访问。初值均为false

void Dijkstra(int s){	//s为起点 
	fill(d,d+MAXV,INF);		//fill函数将整个d数组赋为INF(慎用memset)
	d[s] = 0;				 // 起点s到自身的距离为0
	for(int i=0;i<n;i++)
	{
		int u=-1,MIN=INF; //u使d[u]最小,MIN存放该最小的d[u]  u是与起点s的最短距离最小的一个顶点 
		for(int j=0;j<n;j++)	//找到未访问的顶点中d[]最小的 
		{
			if(vis[j] == false && d[j] < MIN)
			{
				 u=j;
				 MIN=d[j];
			 } 
		 } 
		 //找不到小于INF的d[u],说明剩下的顶点和起点s不连通
		 if(u == -1)
		 return;
		 vis[u] = true; 	//标记u为已访问
		 for(int v=0;v<n;v++) 	//如果v未访问&&u能到达v&&以u为中介点可以是d[v]更优   d[v]是s到顶点v的最短距离 
		 {
		 	if(vis[v] == false && G[u][v] != INF && d[u] + G[u][v]<d[v])
		 	{
		 		d[v]=d[u]+G[u][v];		//优化d[v]	
			}

		  } 
	 } 
} 

int main()
{
	int u,v,w;
	scanf("%d%d%d",&n,&m,&s);	//顶点个数、边数、起点编号 
	fill(G[0],G[0]+MAXV*MAXV,INF);   //初始化图G
	for(int i=0;i<m;i++)
	{
		scanf("%d%d%d",&u,&v,&w);		//输入u,v以及u->v的边权
		G[u][v] = w; 
	 } 
	 Dijkstra(s); //Dijkstra算法入口
	 for(int i=0;i<n;i++)
	 {
	 	printf("%d",d[i]);		//输出所有顶点的最短距离 
	  } 
	  return 0; 
 } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/891229
推荐阅读
相关标签
  

闽ICP备14008679号