Dijkstra单源最短路径实现 及 Floyd任意两点之间的最短路径

Dijkstra算法
void printPath(int path, int a){
	int stack[maxSize],top= -1;
	while(path[a]!=-1){
		stack[++top] = a;
		a = path[a];
	}
	stack[++top]=a;
	while(top!=-1)
		print(stack[++top]+" ");
	print("\n");
}

void Dijkstra(MGraph g, int v, int dist[], int path[]){
	int set[maxSize];
	int min, i, j;
	for(i = 1;i <= g.n; i++){
		dist[i] = g.edges[v][i];
		set[i] = 0;
		if(g.edges[v][i] < INF)
			path[i] = v;
		else
			path[i] = -1;
	}
	set[v] = 1;
	path[v] = -1;
	for(i = 1; i <= g.n; ++i){
		min = INF;
		for(j = 1; j <= g.n; ++j){
			if(set[j]==0&&dist[j] < min){
				min = dist[j];
				u = j;
			}
		}
		for(j = 1; j <=g.n; ++j){
			if(set[j]==0&& dist[j] > dist[u]+g.edges[u][j]){
				dist[j] = dist[u]+g.edges[u][j];
				path[j] = u;
			}
		}
	}
}

Floyd算法:
void Floyd(MGraph g, int A[][maxSize], int path[][maxSize]){
	int i, j, k;
	for(i = 0;i < g.n; ++i){
		A[i][j] = g.edges[i][j];
		path[i][j] = -1;
	}

	for(k = 0; k < g.n; ++k){
		for(i = 0; i < g.n; ++i){
			for(j = 0; j < g.n; ++j){
				if(A[i][j]> A[i][k]+A[k][j]){
					A[i][j] = A[i][k]+A[k][j];
					Path[i][j] = k;
				}
			}
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值