弗洛伊德(Floyd)算法

  1 #include <stdio.h>
  2
  3 #define MAXVEX 20        //最大顶点数
  4 #define INFINITY 65535    //∞
  5
  6
  7 typedef struct
  8 {/*    图结构    */
  9     int vexs[MAXVEX];//顶点下标
 10     int arc[MAXVEX][MAXVEX];//矩阵
 11     int numVertexes, numEdges;//顶点数和边数
 12 }MGraph;
 13
 14 //用户定义类型
 15 typedef int Patharc[MAXVEX][MAXVEX];
 16 typedef int ShortPathTable[MAXVEX][MAXVEX];
 17
 18 void CreateMGraph(MGraph *G)
 19 {/*    创建图    */
 20     int i, j;
 21
 22     //printf ("请输入顶点数和边数");
 23     //提前输入
 24     G->numVertexes = 9;
 25     G->numEdges = 16;
 26
 27     //初始化顶点下标
 28     for(i=0; i<G->numVertexes; i++)
 29         G->vexs[i] = i;
 30
 31     //初始化矩阵
 32     for(i=0; i<G->numVertexes; i++)
 33         for(j=0; j<G->numVertexes; j++)
 34             if(i == j)
 35                 G->arc[i][j] = 0;
 36             else
 37                 G->arc[i][j] = INFINITY;
 38
 39     //提前手动输入权值
 40     G->arc[0][1] = 1;
 41     G->arc[0][2] = 5;
 42
 43     G->arc[1][2] = 3;
 44     G->arc[1][3] = 7;
 45     G->arc[1][4] = 5;
 46
 47     G->arc[2][4] = 1;
 48     G->arc[2][5] = 7;
 49
 50     G->arc[3][4] = 2;
 51     G->arc[3][6] = 3;
 52
 53     G->arc[4][5] = 3;
 54     G->arc[4][6] = 6;
 55     G->arc[4][7] = 9;
 56
 57     G->arc[5][7] = 5;
 58
 59     G->arc[6][7] = 2;
 60     G->arc[6][8] = 7;
 61
 62     G->arc[7][8] = 4;
 63
 64     //矩阵上三角对称下三角
 65     for(i=0; i<G->numVertexes; i++)
 66         for(j=i; j<G->numVertexes; j++)
 67             G->arc[j][i] = G->arc[i][j];
 68
 69     return;
 70 }
 71
 72 void ShortestPath_Floyd(MGraph G, Patharc *P, ShortPathTable *D)
 73 {/*    D数组用于存储最短路径的权值,P数组用于存储最短路径经过顶点的下表    */
 74     int v, w, k;
 75
 76     //初始化D与P
 77     for(v=0; v<G.numVertexes; v++)
 78         for(w=0; w<G.numVertexes; w++)
 79         {
 80             (*D)[v][w] = G.arc[v][w];//D[v][w]值即为对应的权值
 81             (*P)[v][w] = w;//初始化P
 82         }
 83
 84     for(k=0; k<G.numVertexes; k++)
 85         for(v=0; v<G.numVertexes; v++)
 86             for(w=0; w<G.numVertexes; w++)
 87                 if((*D)[v][w] > (*D)[v][k]+(*D)[k][w])
 88                 {//这里可以理解为:v到w 的路径比 v到k 然后 k到w 的路径,目的是要v顶点到达w顶点,然后采取间接的方法进行比较
 89                     (*D)[v][w] = (*D)[v][k] + (*D)[k][w];//经过顶点k比直达更近,则赋值
 90                     (*P)[v][w] = (*P)[v][k];//经过顶点的下表赋给对应的P数组
 91                 }//v代表起始顶点的下表,k代表中转顶点的下表,w代表终点顶点的下表
 92
 93     return;
 94 }
 95
 96 int main(void)
 97
 98 {
 99     int v, w, k;
100
101     MGraph G;
102
103     Patharc P;//定义存储最短路径经过的顶点下标的数组
104     ShortPathTable D;//定义存储各点最短路径
105
106     CreateMGraph(&G);//创建图
107
108     ShortestPath_Floyd(G, &P, &D);//最短路径——弗洛伊德
109
110     printf("\t\t\t各顶点最短路径如下:\n");
111     for(v=0; v<G.numVertexes; v++)
112     {
113         for(w=v+1; w<G.numVertexes; w++)
114         {
115             printf("v%d-v%d weight:%d\t", v, w, D[v][w]);//顶点—》顶点——权值
116             k = P[v][w];//经过顶点下标
117             printf("path:%d", v);//打印源点
118             while(k != w)
119             {//若经过顶点不等于终点
120                 printf(" ->%d", k);//则打印经过顶点
121                 k = P[k][w];//        获取下一个经过顶点
122             }
123             printf(" ->%d\n", w);
124         }
125         printf("\n");
126     }
127
128     printf("\t\t\t最短路径D:\n");
129     for(v=0; v<G.numVertexes; v++)
130     {
131         for(w=0; w<G.numVertexes; w++)
132             printf("%5d", D[v][w]);
133         printf("\n");
134     }
135
136     printf("\t\t\t最短路径P:\n");
137     for(v=0; v<G.numVertexes; v++)
138     {
139         for(w=0; w<G.numVertexes; w++)
140             printf("%5d", P[v][w]);
141         printf("\n");
142     }
143
144     return 0;
145 }
时间: 2024-10-27 08:21:00

弗洛伊德(Floyd)算法的相关文章

44. 蛤蟆的数据结构笔记之四十四弗洛伊德Floyd算法

44. 蛤蟆的数据结构笔记之四十四弗洛伊德Floyd算法 本篇名言:"希望是厄运的忠实的姐妹. --普希金" 我们继续来看下数据结构图中的一个算法,这个算法来自图灵奖得主. 1.  Floyd算法介绍 Floyd算法又称为插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名.注意这个可不是心理学的那个弗洛伊德. 是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径

C# 弗洛伊德(Floyd)算法

弗洛伊德(Floyd)算法 主要是用于计算图中所有顶点对之间的最短距离长度的算法,如果是要求某一个特定点到图中所有顶点之间的最短距离可以用Dijkstra(迪杰斯特拉)算法来求. 弗洛伊德(Floyd)算法的算法过程是: 1.从任意一条单边路径开始.所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大. 2.对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短.如果是更新它. 把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则G[i

[Python] 弗洛伊德(Floyd)算法求图的直径并记录路径

相关概念 对于一个图G=(V, E),求图中两点u, v间最短路径长度,称为图的最短路径问题.最短路径中最长的称为图的直径. 其中,求图中确定的某两点的最短路径算法,称为单源最短路径算法.求图中任意两点间的最短路径算法,称为多源最短路径算法. 常用的路径算法有: Dijkstra算法 SPFA算法\Bellman-Ford算法 Floyd算法\Floyd-Warshall算法 Johnson算法 其中最经典的是Dijkstra算法和Floyd算法.Floyd算法是多源最短路径算法,可以直接求出图

JS实现最短路径之弗洛伊德(Floyd)算法

弗洛伊德算法是实现最小生成树的一个很精妙的算法,也是求所有顶点至所有顶点的最短路径问题的不二之选.时间复杂度为O(n3),n为顶点数. 精妙之处在于:一个二重初始化,加一个三重循环权值修正,完成了所有顶点至所有顶点的的最短路径计算,代码及其简洁 JS实现: //定义邻接矩阵 let Arr2 = [ [0, 1, 5, 65535, 65535, 65535, 65535, 65535, 65535], [1, 0, 3, 7, 5, 65535, 65535, 65535, 65535], [

多源最短路Floyd 算法————matlab实现

弗洛伊德(Floyd)算法是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名. 基本思想 通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离. 假设图G中顶点个数为N,则需要对矩阵S进行N次更新.初始时,矩阵S中顶点a[i][j]的距离为顶点i到顶点j的权值:如果i和j不相邻,则a[i][j]=∞

Floyd算法(三)之 Java详解

前面分别通过C和C++实现了弗洛伊德算法,本文介绍弗洛伊德算法的Java实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计

Floyd算法(二)之 C++详解

本章是弗洛伊德算法的C++实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名. 基本思想

Floyd算法之java详解

弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名. 基本思想 通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离. 假设图G中顶点个数为N,则需要对矩阵S进行N次更新.初始时,矩阵S中顶点a[i][j]的距离为顶点i到顶点

Floyd算法(一)之 C语言详解

本章介绍弗洛伊德算法.和以往一样,本文会先对弗洛伊德算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算