最短路径的程序---学会如何调试

本文介绍了一种使用迪杰斯特拉算法寻找加权图中两点间最短路径的方法,并通过C语言实现。该算法适用于非负权重的图,能够有效地找到从起点到其他所有顶点的最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct a{
	int vexnum;
	int arcnum;
	int arc[5][5];
}MGraph;

typedef struct b {
	char temp[5][5];
}PathMatrix;

void 
Shortest_DIJ(const MGraph * G ,const int v0,PathMatrix * P,int *D) {
	int v, w, i,j, min;
	char final[5];
	for (v = 0;v < G->vexnum; ++v) {
		final[v] = 0;
		D[v] = G->arc[v0][v];
		for (w = 0 ;w < G->vexnum; ++w) P->temp[v][w] = 0;
		if (D[v] < INT_MAX) {
			P->temp[v][v0] = 1;
			P->temp[v][v] = 1;
		}
	}
	D[v0] = 0; final[v0] = 1;
	for (i = 1;i< G->vexnum; ++i) {
		min = INT_MAX;
		for (w = 0 ; w < G->vexnum; ++w) 
			if (!final[w])
				if(D[w] < min) {
					v = w;
					min = D[w];
				}
			final[v] = 1;
			for (w = 0; w < G->vexnum; ++w) 
				if (!final[w] && (min + G->arc[v][w] < D[w])) {
					D[w] = min + G->arc[v][w];
					for (j = 0; j < G->vexnum ; ++j) 
						P->temp[w][j] = P->temp[v][j];
					P->temp[w][w] = 1;
				}
		
	}
	for (i = 0;i < 5;++i) {
		for (w = 0 ;w <= i; ++w)
		if (P->temp[i][w]) printf("%d/t",w);
		printf("/n");
	}
	printf("/n");
}
int main(void) {
	MGraph G = {
		5,
		8,
		{
			{INT_MAX,4,5,4,1},
			{4,INT_MAX,2,2,2},
			{3,2,INT_MAX,3,2},
			{2,INT_MAX,3,3,5},
			{1,3,2,5,INT_MAX}
		}
	};
	PathMatrix P = {
		{
			{0xFF,0xFF,0xFF,0xFF,0xFF},
			{0xFF,0xFF,0xFF,0xFF,0xFF},
			{0xFF,0xFF,0xFF,0xFF,0xFF},
			{0xFF,0xFF,0xFF,0xFF,0xFF},
			{0xFF,0xFF,0xFF,0xFF,0xFF}
		}
	};
	int D[5];
	Shortest_DIJ(&G,3,&P,D);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值