最短路径Dijkstra算法

计算北京到其它各城市的最短距离

//最短路径Dijkstra算法
#include<iostream> 
#include<vector>
#include<cstdio>
#define INF 99999999 //路径的最大值 
using namespace std;
/*
	graph 图的邻接矩阵
	start  起始顶点编号
	返回值:返回一个一维向量 存储起始顶点到其它顶点的最短路径
	 
*/
vector<int> Dijkstra(vector<vector<int> > &graph, int start){
	int n = graph.size(); //存储图中的顶点个数 
	vector<int> visit(n, 0); //标记已作为中间节点完成访问的顶点 
	vector<int> dist(n, 0); //存储从起点start到其它顶点的最短路径
	
	for (int i = 0; i < n; i++) {
		dist[i] = graph[start][i];//将dist数组初始化为图中的路径长度 
	}
	visit[start] = 1; //标记起始顶点
	
	for(int i = 0; i < n; i++){//更新最短路径的循环,循环进行n次 
		int min_dist = INF; //存储从起点到其他未被访问节点中的最短距离
		int middle = 0; //存储最短距离节点的编号
		//遍历n个顶点,寻找当前未被访问的顶点中的距离起始顶点最短距离的节点的编号 
		for (int j = 0; j < n; j++) {
			//如果visit[j] == 0说明未被访问过,且min_dist > dist[j] 时 
			if (visit[j] == 0 && min_dist > dist[j]){
				min_dist =  dist[j]; //更新最短距离 min_dist 为dist[j] 
				middle = j; //更新顶点编号middle 为j 
			}
		}
		//以middle为中间节点, 再循环遍历其它所有节点 
		for (int j = 0; j < n; j++){
			//如果当前遍历的节点未曾作为中间节点,并且
			//从起始节点 到j 的距离dist[j] 大于从起始节点到middle与
			//从middle到j的距离和 
			if (visit[j] == 0 && dist[j] > dist[middle] + graph[middle][j]){
				//更新起始节点到j的距离dist[j],更新为起始节点到middle与
				//middle到j的距离之和 
				dist[j] = dist[middle] + graph[middle][j];
			}
		}
		visit[middle] = 1; //将middle顶点设置为访问 
	}
	
	return dist;	 //返回最短路径结果 
	
}
int main(){
	vector<vector<int> > graph;
	// 0 北京 1 天津 2 郑州 3 济南 4 长沙 5 海南
	int n = 6;
	for (int i = 0; i < n; i++) {
		graph.push_back(vector<int>());
		for (int j = 0; j < n; j++){
			graph[i].push_back(INF);
		}
		graph[i][i] = 0;
	}
	graph[0][1] = 100;
	graph[1][0] = 100;
	
	graph[0][2] = 1200;
	graph[2][0] = 1200;
	
	graph[1][2] = 900;
	graph[2][1] = 900;
	
	graph[1][3] = 300;
	graph[3][1] = 300;
	
	graph[2][3] = 400;
	graph[3][2] = 400;
	
	graph[2][4] = 500;
	graph[4][2] = 500;
	
	graph[3][4] = 1300;
	graph[4][3] = 1300;
	
	graph[3][5] = 1400;
	graph[5][3] = 1400;
	
	graph[4][5] = 1500;
	graph[5][4] = 1500;
	
	//计算北京到其它城市的最短距离
	vector<int> dist = Dijkstra(graph, 0);
	printf("From 北京 min_dist:\n");
	for (int i = 0; i < n; i++){
		printf("dist[%d] = %d\n", i, dist[i]);
	}
	return 0;
}

结果:

 

以下为北京到各城市最短路径经过的城市序列

0-0

0-1

0-1-3-2

0-1-3

0-1-3-2-4

0-1-3-5

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值