Dijkstra 单源最短路径算法

#include<iostream>
// 定义图中节点个数
#define V 9
using namespace std;

// dist:距离表,path:加入最短路径的节点标记为 true
// 找到距离表中最短路径长度的节点,且该节点未加入路径集
int minDistance(int dist[], bool path[]) {
	int min = INT_MAX, minIndex;

	for (int v = 0; v < V; v++) {
		if (path[v] == false && dist[v] <= min) {
			min = dist[v], minIndex = v;
		}
	}
	return minIndex;
}


void printSolution(int dist[]) {
	cout << "节点 \t 源点到该节点的距离" << endl;
	for (int i = 0; i < V; i++)
		cout << i << " \t\t" << dist[i] << endl;
}

void dijkstra(int graph[V][V], int src) {
	
	int dist[V]; // 距离表,会存储从 src 到 i 的最短距离值
	bool path[V]; // 路径表,如果节点 i 加入到路径表,则赋 true

	// 初始化距离表和路径集合
	for (int i = 0; i < V; i++) {
		dist[i] = INT_MAX, path[i] = false;
	}

	// 源点到自身的距离是 0
	dist[src] = 0; 
	// 目前距离表应该为 0,INF,INF...

	for (int count = 0; count < V - 1; count++) {

		int u = minDistance(dist, path); // u 在首轮迭代时就是 src

		path[u] = true;

		for (int v = 0; v < V; v++) {
			// 1. 未加入路径集
			// 2. u 和 v 是有边的
			// 3. src 到 v 是连通的
			// 4. 如果把 v 加入路径集,距离表中到达 v 的距离值比当前小
			if (!path[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) {
				dist[v] = dist[u] + graph[u][v]; // 满足以上 4 个条件则更新距离表,否则不更新
			}
		}
	}

	printSolution(dist);
}

int main()
{
	int graph[V][V] = { { 0, 4, 0, 0, 0, 0, 0, 8, 0 },
						{ 4, 0, 8, 0, 0, 0, 0, 11, 0 },
						{ 0, 8, 0, 7, 0, 4, 0, 0, 2 },
						{ 0, 0, 7, 0, 9, 14, 0, 0, 0 },
						{ 0, 0, 0, 9, 0, 10, 0, 0, 0 },
						{ 0, 0, 4, 14, 10, 0, 2, 0, 0 },
						{ 0, 0, 0, 0, 0, 2, 0, 1, 6 },
						{ 8, 11, 0, 0, 0, 0, 1, 0, 7 },
						{ 0, 0, 2, 0, 0, 0, 6, 7, 0 } };

	dijkstra(graph, 0);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值