弗洛伊德(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 ...
随机推荐
- imgur.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import with_statement import sys impor ...
- How Node.js Multiprocess Load Balancing Works
As of version 0.6.0 of node, load multiple process load balancing is available for node. The concept ...
- jquery跨域访问解决方案(转)
客户端“跨域访问”一直是一个头疼的问题,好在有jQuery帮忙,从jQuery-1.2以后跨域问题便迎刃而解.由于自己在项目中遇到跨域问题,借此机会对跨域问题来刨根问底,查阅了相关资料和自己的实践,算 ...
- Arduino红外遥控系列教程2013——发射与接收
教程一:红外接收教程本教程共四步操作,将教大家如何收集电视红外遥控器的编码 视频链接:http://v.youku.com/v_show/id_XNTE2NjQ5NTcy.html 第一步:电路连接, ...
- libevent evbuffer bug
今天发现 libevent 2.0.22 一个坑爹的bug,导致消息混乱.查找问题浪费一天,复现代码如下 #include <event2/buffer.h> #include <s ...
- JavaScript声音播放
方式一: /** * 播放音频(Chrome.opera)支持 * @param file:支持 rm,mid,wav */ function playAudio(file) { var embed= ...
- Oracle password expire notices
/usr/local/webserver/tomcat6/logs/logbak/zsxxw.log.2015-03-21.txt:2015-03-22 00:47:26,366 ORA-28002: ...
- svm中的数学和算法
支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维模式识别中表现出很多特有的优势,并可以推广应用到函数拟合等其它 ...
- UVA 10131 Is Bigger Smarter?(DP)
Some people think that the bigger an elephant is, the smarter it is. To disprove this, you want to t ...
- Bctf-pwn_ruin-re_lastflower
Pwn-ruin 用几个词来概括下漏洞原理:Arm+heap overflow(house of force)+dl-resolve Info leak: 在printf key8时,泄漏堆上地址(s ...