迪杰斯特拉算法——C语言

迪杰斯特拉算法是一种用于在图中寻找节点之间最短路径的算法。它常用于路由以及其他图算法的子过程。

假设我们输入的是0顶点:

第一步,先寻找距离最小的顶点,这也是我们找到的第一个顶点,也就是顶点1,因为其他顶点距离一定大于12(未连接的顶点一定大于12,因为需要中转)。

第二步,把最近顶点作为中转点(顶点1)标记已访问,遍历其他未访问顶点,更新到顶点0 的距离(将顶点1作为中转点更新距离)。

第三步,重复第一步和第二步。

我们可以写出类似于这样的代码:

cpp 复制代码
void Dijkstra(Graph* G,int index) {
    开辟访问未访问数组
    开辟距离顶点index距离数组
	for (int i = 0; i < G->vexsNum; i++) {
        初始化两个数组

	}
	for (int a = 0; a < G->vexsNum - 1; a++) {
        找到最小距离的顶点
        标记已访问
        for (int j = 0; j < G->vexsNum; j++) {
	    if (未访问 && 经过中转点的距离 < 距离数组的距离) {
            更新距离
	    }
        }
	}


}

寻找最小距离顶点的代码如下:

cpp 复制代码
int GetMin(Graph* G,int* S,int* D) {
	int min = Max;
	int index;
	for (int i = 0; i < G->vexsNum;i++) {
		if (S[i] == 0 && D[i] > 0) {
			if (min > D[i]) {
				min = D[i];
				index = i;
			}
		}
	}
	return index;
}

接下来是迪杰斯特拉算法的代码:

cpp 复制代码
void Dijkstra(Graph* G,int index) {
	int* S = (int*)malloc(sizeof(int) * G->vexsNum);
	int* D = (int*)malloc(sizeof(int) * G->vexsNum);
	for (int i = 0; i < G->vexsNum; i++) {
		if (i == index) {
			S[i] = 1;
		}
		else
		{
			S[i] = 0;
		}
		D[i] = G->arcs[index][i];
	}
	for (int a = 0; a < G->vexsNum - 1; a++) {
		index = GetMin(G, S, D);
		S[index] = 1;
		for (int j = 0; j < G->vexsNum; j++) {
			if (S[index] != 0 && D[index] + G->arcs[index][j] < D[j]) {
				D[j] = D[index] + G->arcs[index][j];
			}
		}
	}

}

初始化将输入顶点标记为1,未访问顶点标记为0。

我们可以模拟顶点1为中转点的情况,这时连接顶点2 的距离就由Max变为12+10=22。其他结果都不变。

然后接着寻找最小顶点顶点6(顶点1已经访问过了),这时顶点6 作为中转点,连接顶点4 的距离就由Max变为14+8=22。其他结果不变。

现在接着寻找最小顶点顶点5,依次类推。

最后结果如下:

这就是文章的全部内容了,希望对你有所帮助,如有错误欢迎指出。

相关推荐
刘阿去3 小时前
tcc编译器教程6 进一步学习编译gmake源代码
c语言·学习
安忘4 小时前
LeetCode 热题 -189. 轮转数组
算法·leetcode·职场和发展
Y1nhl4 小时前
力扣hot100_二叉树(4)_python版本
开发语言·pytorch·python·算法·leetcode·机器学习
曼诺尔雷迪亚兹5 小时前
2025年四川烟草工业计算机岗位备考详细内容
数据结构·数据库·计算机网络·算法
蜡笔小新..5 小时前
某些网站访问很卡 or 力扣网站经常进不去(2025/3/10)
算法·leetcode·职场和发展
life_time_6 小时前
C语言(23)
c语言·开发语言
Simon523146 小时前
数据结构---八大排序
java·数据结构·排序算法
星夜钢琴手6 小时前
C/C++ 实现由用户通过键盘输入自然数并判断其是不是素数(带清空缓冲区等考虑)
c语言·开发语言·c++·c/c++
IT猿手6 小时前
2025最新群智能优化算法:基于RRT的优化器(RRT-based Optimizer,RRTO)求解23个经典函数测试集,MATLAB
开发语言·人工智能·算法·机器学习·matlab
刘大猫266 小时前
五、MyBatis的增删改查模板(参数形式包括:String、对象、集合、数组、Map)
人工智能·算法·智能合约