浅谈Dijkstra算法

计算最短路径比较常用的算法就是Dijkstra和Floyd算法,相对前者 我感觉后者稍微好理解一点。对于Dijkstra算法,我发表下我的愚见,如有疏漏之处欢迎改正

我学习算法途径是看中国mooc上,陈越老师讲的数据结构视频,有些基本思想我就照搬老师所讲的内容

算法主要思想为:

void Dijkstra(vertex s)
{
	对顶点s进行邻接边进行初始化
	while(1)
	{
		v=未收录顶点中dist值最小者;
		if(v不存在)
			break;
		collected[v]=true;
		for(v的每个邻接点w)
			if(collected[w]==false&&dist[v]+[v][w]<dist[w])
			{
				dist[w]=dist[v]+[v][w];
			}
	}
}
dist:两个顶点之间的距离

如果用邻接矩阵表示,代码如下:

#include<iostream>
#include<cstring>
using namespace std;
int INF=1<<28;
#define MAXV 1000//最多顶点数 
int edge[MAXV+1][MAXV+1];//邻接矩阵 
int dist[MAXV+1];
int n;//顶点数 
int s;//从s点出发的最短路径 
int visite[MAXV+1];
int find_min_dist()//寻找dist值最小的dist 
{
	int min_dist=INF;
	int min_number;
	for(int i=1;i<=n;i++)
	{
		if(visite[i]==0&&dist[i]<min_dist)
		{
			min_dist=dist[i];
			min_number=i;
		}
	}
	if(min_dist<INF)
		return min_number;
	else 
		return -1;
}
void Dijkstra()
{
	int i;
	for(i=1;i<=n;i++)
		dist[i]=edge[s][i];
	dist[s]=0;
	visite[s]=1;
	while(1)
	{
		int k=find_min_dist();
		if(k==-1)
			break;
		visite[k]=1;
		for(i=1;i<=n;i++)
		{
			if(visite[i]==0&&edge[k][i]<INF)
			{
				if(dist[k]+edge[k][i]<dist[i])
					dist[i]=dist[k]+edge[k][i];
			}
		}
	}
} 
int main()
{
	
	int i,j;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
		{
			edge[i][j]=INF;
		 } 
	memset(visite,0,sizeof(visite));
	return 0;
 } 

用邻接表表示,代码如下:

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
int INF=1<<28;
#define MAXV 1000//最多顶点数 
typedef int Vertex;
struct Edge
{
	Vertex end;
	int edge;
};
vector<Edge> Graph[MAXV+1];//邻接表 
int dist[MAXV+1];
int n;//顶点数 
int s;//从s点出发的最短路径 
int visite[MAXV+1];
int find_min_dist()//寻找dist值最小的dist 
{
	int min_dist=INF;
	int min_number;
	for(int i=1;i<=n;i++)
	{
		if(visite[i]==0&&dist[i]<min_dist)
		{
			min_dist=dist[i];
			min_number=i;
		}
	}
	if(min_dist<INF)
		return min_number;
	else 
		return -1;
}
void Dijkstra()
{
	int i;
	for(i=0;i<Graph[s].size();i++)
		dist[Graph[s][0].end]=Graph[s][0].edge;
	dist[s]=0;
	visite[s]=1;
	while(1)
	{
		int k=find_min_dist();
		if(k==-1)
			break;
		visite[k]=1;
		for(i=0;i<Graph[k].size();i++)
		{
			if(visite[Graph[k][i].end]==0&&dist[k]+Graph[k][i].edge<dist[Graph[k][i].end])
			{
					dist[Graph[k][i].end]=dist[k]+Graph[k][i].edge;
			}
		}
	}
} 
int main()
{
	
	memset(dist,127,sizeof(dist);
	memset(visite,0,sizeof(visite));
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/lb_78596935/article/details/80315668