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

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

引入了三个数组,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--;
	}
	
} 

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

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值