弗洛伊德算法

/**
*2018.9.30 10:06
*floyd最短路径算法(任意两点间的最短路径,与dijkstra算法都适用于连通图)
*path保存从某点a到某点b的下一个顶点的标号
*/
#include<stdio.h>

#define MAX 100
//表示两点之间没有路径
#define MAX_WEIGHT 1000

typedef struct Matrix {
	char e[MAX];
	int edge[MAX][MAX];
	int v_num, e_num;
}Matrix;

void floyd(Matrix *g, int path[][MAX], int cost[][MAX]);
void printPath(int path[][MAX], int source, int terminus);

int main(void) {
	Matrix g = {
	"hhhaah",
	{{MAX_WEIGHT, 5,MAX_WEIGHT,7},
	 {MAX_WEIGHT,MAX_WEIGHT,4,2},
	 {3,3,MAX_WEIGHT,2},
	 {MAX_WEIGHT,MAX_WEIGHT,1,MAX_WEIGHT},
	},
	4,8 
	};
	int path[MAX][MAX];
	int cost[MAX][MAX];
	floyd(&g, path, cost);
	printPath(path ,0 , 0);

	putchar('\n');
	system("pause");
	return 0;
}


void floyd(Matrix *g, int path[][MAX], int cost[][MAX]) {
	int i, j, k;
	for (i = 0; i < g->v_num; ++i){
		for (j = 0; j < g->v_num; ++j) {
			path[i][j] = -1;
			cost[i][j] = g->edge[i][j];
		}
	}
		
	for (k = 0; k < g->v_num; ++k) {
		for (i = 0; i < g->v_num; ++i) {
			for (j = 0; j < g->v_num; ++j) {
				if ( i != j && cost[i][j] > cost[i][k] + cost[k][j]) {
					path[i][j] = k;
					cost[i][j] = cost[i][k] + cost[k][j];
				}
			}
		}
	} 
}

void printPath(int path[][MAX], int source, int terminus) {
	
		printf("%d,", source);
		int mid = path[source][terminus];
		while (mid != -1) {
				printf("%d,", mid);
				mid = path[mid][terminus];
		}
		printf("%d,", terminus);
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值