#include <stdio.h>

 #define MAXVEX 20        //最大顶点数
#define INFINITY 65535 //∞ typedef struct
{/* 图结构 */
int vexs[MAXVEX];//顶点下标
int arc[MAXVEX][MAXVEX];//矩阵
int numVertexes, numEdges;//顶点数和边数
}MGraph; //用户定义类型
typedef int Patharc[MAXVEX][MAXVEX];
typedef int ShortPathTable[MAXVEX][MAXVEX]; void CreateMGraph(MGraph *G)
{/* 创建图 */
int i, j; //printf ("请输入顶点数和边数");
//提前输入
G->numVertexes = ;
G->numEdges = ; //初始化顶点下标
for(i=; i<G->numVertexes; i++)
G->vexs[i] = i; //初始化矩阵
for(i=; i<G->numVertexes; i++)
for(j=; j<G->numVertexes; j++)
if(i == j)
G->arc[i][j] = ;
else
G->arc[i][j] = INFINITY; //提前手动输入权值
G->arc[][] = ;
G->arc[][] = ; G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ; G->arc[][] = ;
G->arc[][] = ; G->arc[][] = ;
G->arc[][] = ; G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ; G->arc[][] = ; G->arc[][] = ;
G->arc[][] = ; G->arc[][] = ; //矩阵上三角对称下三角
for(i=; i<G->numVertexes; i++)
for(j=i; j<G->numVertexes; j++)
G->arc[j][i] = G->arc[i][j]; return;
} void ShortestPath_Floyd(MGraph G, Patharc *P, ShortPathTable *D)
{/* D数组用于存储最短路径的权值,P数组用于存储最短路径经过顶点的下表 */
int v, w, k; //初始化D与P
for(v=; v<G.numVertexes; v++)
for(w=; w<G.numVertexes; w++)
{
(*D)[v][w] = G.arc[v][w];//D[v][w]值即为对应的权值
(*P)[v][w] = w;//初始化P
} for(k=; k<G.numVertexes; k++)
for(v=; v<G.numVertexes; v++)
for(w=; w<G.numVertexes; w++)
if((*D)[v][w] > (*D)[v][k]+(*D)[k][w])
{//这里可以理解为:v到w 的路径比 v到k 然后 k到w 的路径,目的是要v顶点到达w顶点,然后采取间接的方法进行比较
(*D)[v][w] = (*D)[v][k] + (*D)[k][w];//经过顶点k比直达更近,则赋值
(*P)[v][w] = (*P)[v][k];//经过顶点的下表赋给对应的P数组
}//v代表起始顶点的下表,k代表中转顶点的下表,w代表终点顶点的下表 return;
} int main(void) {
int v, w, k; MGraph G; Patharc P;//定义存储最短路径经过的顶点下标的数组
ShortPathTable D;//定义存储各点最短路径 CreateMGraph(&G);//创建图 ShortestPath_Floyd(G, &P, &D);//最短路径——弗洛伊德 printf("\t\t\t各顶点最短路径如下:\n");
for(v=; v<G.numVertexes; v++)
{
for(w=v+; w<G.numVertexes; w++)
{
printf("v%d-v%d weight:%d\t", v, w, D[v][w]);//顶点—》顶点——权值
k = P[v][w];//经过顶点下标
printf("path:%d", v);//打印源点
while(k != w)
{//若经过顶点不等于终点
printf(" ->%d", k);//则打印经过顶点
k = P[k][w];// 获取下一个经过顶点
}
printf(" ->%d\n", w);
}
printf("\n");
} printf("\t\t\t最短路径D:\n");
for(v=; v<G.numVertexes; v++)
{
for(w=; w<G.numVertexes; w++)
printf("%5d", D[v][w]);
printf("\n");
} printf("\t\t\t最短路径P:\n");
for(v=; v<G.numVertexes; v++)
{
for(w=; w<G.numVertexes; w++)
printf("%5d", P[v][w]);
printf("\n");
} return ;
}

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

  1. C# 弗洛伊德(Floyd)算法

    弗洛伊德(Floyd)算法 主要是用于计算图中所有顶点对之间的最短距离长度的算法,如果是要求某一个特定点到图中所有顶点之间的最短距离可以用;        ;    ;    ;            ...

  2. 最短路径 - 弗洛伊德(Floyd)算法

    为了能讲明白弗洛伊德(Floyd)算法的主要思想,我们先来看最简单的案例.图7-7-12的左图是一个简单的3个顶点的连通网图. 我们先定义两个二维数组D[3][3]和P[3][3], D代表顶点与顶点 ...

  3. 图的最短路径---弗洛伊德(Floyd)算法浅析

    算法介绍 和Dijkstra算法一样,Floyd算法也是为了解决寻找给定的加权图中顶点间最短路径的算法.不同的是,Floyd可以用来解决"多源最短路径"的问题. 算法思路 算法需要 ...

  4. 数据结构与算法——弗洛伊德(Floyd)算法

    介绍 和 Dijkstra 算法一样,弗洛伊德(Floyd)算法 也是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978 年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特 ...

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

    相关概念 对于一个图G=(V, E),求图中两点u, v间最短路径长度,称为图的最短路径问题.最短路径中最长的称为图的直径. 其中,求图中确定的某两点的最短路径算法,称为单源最短路径算法.求图中任意两 ...

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

    弗洛伊德算法是实现最小生成树的一个很精妙的算法,也是求所有顶点至所有顶点的最短路径问题的不二之选.时间复杂度为O(n3),n为顶点数. 精妙之处在于:一个二重初始化,加一个三重循环权值修正,完成了所有 ...

  7. 弗洛伊德算法(Floyd算法)

    原博来自http://www.cnblogs.com/skywang12345/ 弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的 ...

  8. Floyd算法(三)之 Java详解

    前面分别通过C和C++实现了弗洛伊德算法,本文介绍弗洛伊德算法的Java实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明 ...

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

    本章是弗洛伊德算法的C++实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明出处:http://www.cnblogs.c ...

随机推荐

  1. js对象中什么是可枚举性(enumerable)?

    说到枚举,可能很多人都会想到枚举类型,但在javascript对象中有一个属性为可枚举性,他是什么呢? 概念 可枚举性(enumerable)用来控制所描述的属性,是否将被包括在for...in循环之 ...

  2. linux命令之uname

    uname是linux中查询系统基本信息的命令. 命令形式: uname [选项] 选项包括:(若不跟任何选项:则默认-s选项) -s, --kernel-name 输出内核名称   -n, --no ...

  3. CURL使用HTTPS的技术小结

    摘自http://www.51testing.com/html/14/175414-248202.html CURL使用HTTPS的技术小结 cURL是linux下命令行提交HTTP(S)请求的一个很 ...

  4. JSPatch 动态更新,bug修复

    本文贴出项目中热修复的代码片段: require('UIView, JPObject, HtmlAllViewController,DataManager,EMClient,EaseMessageVi ...

  5. [AS3]as3与JS的交互(AS3调用JS)实例说明

    一,AS3 vs JavaScript (1)AS3调用JS 函数: ExternalInterface.(functionName:, arguments): //AS3 Code 属性: 同上,通 ...

  6. Hibernate征途(一)之初识

    相见恨晚 很久以前,大概从开始接触数据库开始,就闪过这样一个想法,怎么看怎么觉得数据库表和vb的类模块很像,不是么?除了vb类模块还有函数外:越往下学觉得二者越像,尤其在三层时学到实体类的概念,我去, ...

  7. 【floyd求最小环】【Vijos 1046】【观光旅游】

    标签:图结构 最短路 题目大意:给你一个无向图,至少经过3个节点的简单回路(不能包括其他环) 一开始的思路:用一个NUM[i][j]表示i到j的最短路经过几个节点,显然解法不太优美,而且还是错的 再想 ...

  8. GrideView合并列合并序号,隐藏某列按钮

    合并编号列 /// <summary> /// 合并GridView中某列相同信息的行(单元格) /// </summary> /// <param name=" ...

  9. 牛掰的图片等比缩放js代码

    function resizeImg(img,oAW,oAH){ var oimgW = img.width, oimgH = img.height, oimg = img, oY = (oimgH/ ...

  10. Meta标签中的apple-mobile-web-app-capable属性及含义

    这meta的作用就是删除默认的苹果工具栏和菜单栏. content有两个值”yes”和”no”,当我们需要显示工具栏和菜单栏时,这个行meta就不用加了,默认就是显示.