#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. mini-httpd源码分析-mini-httpd.c

    main函数分析: 一,参数设置: 读取命令行参数 配置文件参数 读取参数,设置对应的全局变量.主要参数有:配置文件:资源目录:进程ID文件:日志文件:字符集:主机名及端口号... 二,参数处理:重点 ...

  2. 【CKEditor ASP.NET】解决360安全浏览器极速模式下不显示

    博主问题只是出在误删了style.js文件 首先我用的是这种模式,在单个页面上导入: <%@ Register Assembly="CKEditor.NET" Namespa ...

  3. SIEM思考

    https://securosis.com/blog/comments/understanding-and-selecting-siem-log-management-introduction/ ht ...

  4. hdu 4686 Arc of Dream_矩阵快速幂

    题意:略 构造出矩阵就行了 |   AX   0    AXBY   AXBY       0  |                                                   ...

  5. word2vec 入门(二)使用教程篇

    word2vec 要解决问题: 在神经网络中学习将word映射成连续(高维)向量,这样通过训练,就可以把对文本内容的处理简化为K维向量空间中向量运算,而向量空间上的相似度可以用来表示文本语义上的相似度 ...

  6. This function or variable may be unsafe. Consider using scanf_s instead.

    去掉安全检查,开头加上即可: #define _CRT_SECURE_NO_WARNINGS 或者: 严重性代码 说明项目文件行禁止显示状态 错误C4996 'scanf': This functio ...

  7. iOS 创建上线证书

    1.制作上线证书需要准备一个付费的账号(99$),登陆https://developer.apple.com在最上方的位置点击Member Center进入登陆界面,在登陆界面输入付费的账号和密码进入 ...

  8. scanf与printf用法详解

    一.scanf家族 1.scanf家族的原型 int scanf(char const *format,...); int fscanf(FILE *stream,char const *format ...

  9. C#整理2——C#的输入输出及基本类型

    //输出 Console.WriteLine("摩西摩西"); Console.Write("hollo");不带回车的 注意: 1.注意大小写敏感.(快捷键操 ...

  10. jQuery的主要用法

    一.选择网页元素jQuery的基本设计和主要用法,就是"选择某个网页元素,然后对其进行某种操作".这是它区别于其他函数库的根本特点. 使用jQuery的第一步,往往就是将一个选择表 ...