Dijkstra算法及优化

Dijkstra算法策略为:
设置集合s存放已被访问的顶点,然后执行n次下面两个步骤(n为顶点数):

  1. 每次从集合v-s中选择与起点s的最短路径最小的一个顶点,访问并加入集合s中
  2. 之后,令顶点u为中介点,优化起点s与所有从u能到达的顶点v之间的最短路径

具体实现如下:

其中DFS函数用于输出访问的最短路径,其算法与DFS算法一致。

#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXV=510;		//最大顶点数
const int INF=1000000;		//无穷大
struct Node{
	int v;
	int dis;		//v为边的目标顶点,dis为边权 
}; 
int n,m,st,ed; 		//n为顶点数,图G使用邻接表实现 ,st和ed分别为起点和终点 
int d[MAXV],minCost=INF;		//起点到达自身的距离为0 
int cost[MAXV][MAXV],G[MAXV][MAXV];
vector<int> pre[MAXV];		//前驱 
vector<int> tempPath,path;		//临时路径,最优路径 
bool vis[MAXV]={false};
void Dijkstra(int s){
	fill(d,d+MAXV,INF);		//fill函数将整个d数组赋为INF 
	d[s]=0;		//u使d[u]最小,min存放该最小的d[u] 
	for(int i=0;i<n;i++){		//循环n次 
		int u=
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值