弗洛伊德(Floyd)算法
#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)算法的更多相关文章
- C# 弗洛伊德(Floyd)算法
弗洛伊德(Floyd)算法 主要是用于计算图中所有顶点对之间的最短距离长度的算法,如果是要求某一个特定点到图中所有顶点之间的最短距离可以用; ; ; ; ...
- 最短路径 - 弗洛伊德(Floyd)算法
为了能讲明白弗洛伊德(Floyd)算法的主要思想,我们先来看最简单的案例.图7-7-12的左图是一个简单的3个顶点的连通网图. 我们先定义两个二维数组D[3][3]和P[3][3], D代表顶点与顶点 ...
- 图的最短路径---弗洛伊德(Floyd)算法浅析
算法介绍 和Dijkstra算法一样,Floyd算法也是为了解决寻找给定的加权图中顶点间最短路径的算法.不同的是,Floyd可以用来解决"多源最短路径"的问题. 算法思路 算法需要 ...
- 数据结构与算法——弗洛伊德(Floyd)算法
介绍 和 Dijkstra 算法一样,弗洛伊德(Floyd)算法 也是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978 年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特 ...
- [Python] 弗洛伊德(Floyd)算法求图的直径并记录路径
相关概念 对于一个图G=(V, E),求图中两点u, v间最短路径长度,称为图的最短路径问题.最短路径中最长的称为图的直径. 其中,求图中确定的某两点的最短路径算法,称为单源最短路径算法.求图中任意两 ...
- JS实现最短路径之弗洛伊德(Floyd)算法
弗洛伊德算法是实现最小生成树的一个很精妙的算法,也是求所有顶点至所有顶点的最短路径问题的不二之选.时间复杂度为O(n3),n为顶点数. 精妙之处在于:一个二重初始化,加一个三重循环权值修正,完成了所有 ...
- 弗洛伊德算法(Floyd算法)
原博来自http://www.cnblogs.com/skywang12345/ 弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的 ...
- Floyd算法(三)之 Java详解
前面分别通过C和C++实现了弗洛伊德算法,本文介绍弗洛伊德算法的Java实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明 ...
- Floyd算法(二)之 C++详解
本章是弗洛伊德算法的C++实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明出处:http://www.cnblogs.c ...
随机推荐
- Wcf实现IServiceBehavior拓展机制
IServiceBehavior接口 描述:提供一种在整个服务内修改或插入自定义拓展机制: 命名空间: System.ServiceModel.Description程序集: System.Ser ...
- Nginx 配置指令的执行顺序(七)
来看一个 ngx_static 模块服务磁盘文件的例子.我们使用下面这个配置片段: location / { root /var/www/; } 同时在本机的 /var/w ...
- gl.TexSubImage2D 使用遇到图片翻转的问题
这2天在用gl.TexSubImage2D把几张小图转拼接成大图,如果在渲染物体之前拼接好就没有问题,但在开始渲染物体后拼接就会有问题.后来我做了2件事情来找原因, 1. 用拼好的图来画一个正方形,大 ...
- __stdcall,__cdecl,_cdecl,_stdcall,。__fastcall,_fastcall 区别简介
1. 今天写线程函数时,发现msdn中对ThreadProc的定义有要求:DWORD WINAPI ThreadProc(LPVOID lpParameter); 不解为什么要用WINAPI宏定义,查 ...
- js混淆 反混淆 在线
js反混淆地址:http://www.bm8.com.cn/jsConfusion/ 在线javascript 混淆http://www.moralsoft.com/jso-online/hdojso ...
- 【FSFA 读书笔记】Ch 2 Computer Foundatinons(1)
Data Organization 1. 进制转换. 按照正常的书写顺序写一个数字(无论多少进制),其中最左边的列称为“最高有效符号”,最右边的列称为“最低有效符号”. (The right-most ...
- Android的Activity切换动画特效库SwitchLayout,视图切换动画库,媲美IOS
由于看了IOS上面很多开发者开发的APP的视图界面切换动画体验非常好,这些都是IOS自带的,但是Android的Activity等视图切换动画并没有提供原生的,所以特此写了一个可以媲美IOS视图切换动 ...
- C#接口的使用【转】
我们定义一个接口public interface IBark{ void Bark();}再定义一个类,继承于IBark,并且必需实现其中的Bark()方法public class Dog:IBa ...
- 呵呵!手把手带你在 IIS 上执行 Python
公司的站点让我头痛死了.在众多前辈高手的带领下.一大堆的 CMD 在站点里执行得好好地,黑客攻击也好好地.仅仅有站点和我不好好地,我快累死了,站点快挂了.. . 为了解决问题.我想到了 Python ...
- BestCoder Round #3 A,B
A.预处理出来,0(1)输出. Task schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...