Floyd 算法(最短路径)

基本思想: 

1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。

2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。

时间复杂度:O(n^{3})

参考:弗洛伊德(Floyd)算法求图的最短路径  --- JeffCoding

代码:

#include<stdio.h>
#include<memory.h>
#define MAX 1000000

int graph[100][100];   //存放边集及其权重 

int path[100][100];  //存放最短路径 中除了起点终点的 第一个节点 

int vertex[100];  //存放是否遍历过 

int dis[100];

void Creat_G(int vertnum){
	memset(graph,0,sizeof(graph));
	printf("输入图的邻接矩阵:\n");
	
	int i,j;
	for(i=1;i<=vertnum;i++){
		for(j=1;j<=vertnum;j++){
			scanf("%d",&graph[i][j]);
			if(graph[i][j]==0) {
				graph[i][j]=MAX;       //如果两点之间没有边这初始化graph为MAX
			}
			path[i][j]=j;   //初始化开始时的i,j两点间的最短路径的后继为 j 
		}
	}
	
	printf("创建完成\n----------------------\n");
} 

void Floryd(int vertnum){
	int u,v,w,i;   //u 中间点  v 起始点  w 终点
	for(u=1;u<=vertnum;u++){
		for(v=1;v<=vertnum;v++){
			for(w=1;w<=vertnum;w++){
				if(v!=w && graph[v][w]>graph[v][u]+graph[u][w]){
					graph[v][w]=graph[v][u]+graph[u][w];
					path[v][w]=path[v][u];	// 更新最短路径中的除v,w外的第一个节点 
				}	
			}
		}
	}
}



int main(){
	int num;
	printf("输入点的个数:\n");
	scanf("%d",&num);
	printf("-------------------------\n");
	Creat_G(num);
	Floryd(num);
	int i,j,u;
	for(i=1;i<=num;i++){
		for(j=1;j<=num;j++){
			printf("< %d , %d >  ",i,j);
			if(graph[i][j]==MAX)
				printf("$\t\n");
			else{
			
				printf("%d\t",graph[i][j]);
				u=path[i][j];
				printf("%d",i);
				for(;u!=j;u=path[u][j]){    //输出最短路径 
						printf("->%d",u); 
				}
				printf("->%d\n",j);
			}
		}
	}
	


	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42026596/article/details/84594011