图(邻接矩阵)的最短路径

求图的最短路径,有两个经典的算法——dijkstra和floyd算法。

dijkstra算法适合稀疏图(邻接链表)求单点到其他点的最短路径。floyd算法适合稠密图(邻接矩阵)求各点到其他点的最短路径。邻接矩阵是图的一种简单的表示形式。dijkstra算法虽然适合邻接链表,算法题中也常用邻接矩阵实现。

宏定义点个数100,使用typedef定义边权重的类型int,方便程序的调试,同时用int(-1)表示两点间不存在边。

#define MAX_V 100

typedef int var;
const var NO_PATH = -1;

var map[MAX_V][MAX_V];

1.Dijkstra算法

dijkstra采用了贪婪技术,该算法有效的前提是图中没有负数权重的边。

一开始,被选择的点只有源点,每次选择离源点最近的一个未被选择的点,从这个点更新其余未被选择的点的最短距离。

/*dijkstra选择的路径和最短距离*/
int path_d[MAX_V][MAX_V];
var dist_d[MAX_V][MAX_V];
bool visited[MAX_V][MAX_V];

void dijkstra(int n,int s) {
	int *p = path_d[s];
	var *d = dist_d[s];
	bool *v = visited[s];
	for (int i = 0; i < n; i++) {
		d[i] = NO_PATH;
		p[i] = i;
	}
	d[s] = 0;
	while (1) {
		int j = -1;
		for (int i = 0; i < n; i++) {
			if (!v[i]&&d[i]!=NO_PATH && (j == -1 || d[i] < d[j])) {
				j = i;
			}
		}
		v[j]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值