常用的数据结构之迪杰斯特拉算法

通常采用迪杰斯特拉算法来求某一顶点到其余顶点的最小距离。

引入了三个数组,dist[],path[],set[].

其中dist[]数组是用来存放当前状态下,到该节点的额最小权值。path[]数组是存储了当前结点所连接的前一个结点,也就是记录了当前的路径。而set[]数组是分别有0,1两个值,其中0代表该节点未被并入树中,而1代表该节点已经被并入树中。以下是具体的代码:

void Dijkstra(Graph g,int v,int dist[],int path[]){
	for(int i=0;i<g.n;i++){
		dist[i]=g.edgse[v][i]//对数组进行准备工作 
	}
	for(int i=0;i<g.n;i++){//数组的初始化操作 
		dist[i]=g.edgse[v][i];
		set[i]=0;
		if(g.edgse[v][i]<INF){
			path[i]=v;
		}
		else{
			path[i]=-1;
		}
	}
	set[v]=1;//已被利用过 
	path[v]=-1;//代表其没有父结点 
	int min =INF;
	int k;
	for(int i=0;i<g.m;i++){
		for(int w=0;w<g.n;w++){
			if(set[w]==0&&dist[w]<INF){
				min=dist[i];
				k=j;
			}//从中遴选出一个顶点,使通往该结点的路径是通往其余的结点路径中最小的 
		}
		for(int h=0;h<g.n;h++){
			if(set[h]==0&dist[h]>dist[k]+g.edges[k][h])
			dist[h]=dist[k]+g.edges[k][h];//对dist[]数组进行更新 
			path[h]=k;	//保存路径 
		}
	}
}

以下是打印路径的函数: 

void printpath(int path[],int v,int v0){
	int stack[maxn];
	int top=-1;
	
	while(path[v]!=-1){
		v=path[v];
		stack[++top]=v;
	}
	while(top!=-1){
		
	cout << stack[top] << " ";
	top--;
	}
	
} 

普里姆算法与迪杰斯特拉算法的区别,首先普里姆算法是考虑最小代价树,也就是说每一步考虑树的整体到下一个结点的最小权值,而迪杰斯特拉算法是考虑下一个结点到初始结点的最小权值,中间可能横跨了好几个结点。

发布了50 篇原创文章 · 获赞 13 · 访问量 8850

猜你喜欢

转载自blog.csdn.net/weixin_43770577/article/details/89500308