基于Floyd算法的最短路径问题的求解c++
最短路径——floyd算法代码(c语言)
最短路径——floyd算法代码(c语⾔)最短路径问题昨天⾃⼰试了试写⼀下dijkstra的算法博客今天来更floyd算法,感觉⾮常简单果然暴⼒才是解决⼀切的王道⼀、总体思想floyd算法就是每⼀次从邻接矩阵选取⼀个顶点k,然后再去矩阵中遍历两个顶点i,j,看看是i→j的路径短,还是i→k→j的路径短,就是完全的暴⼒,算法和代码⾮常简单⼆、代码实现1void Floyd(Graph G)2 {3int arr[G.vexnum][G.vexnum];4for(int i = 0; i < G.vexnum; i++)5for(int j = 0; j < G.vexnum; i++)6 arr[i][j] = G.edge[i][j];78for(int k; k < G.vexnum; k++)9for(int i = 0; i < G.vexnum; i++)10for(int j = 0; j < G.vexnum; j++)11if(arr[i][j] > arr[i][k] + arr[k][j])12 arr[i][j] = arr[i][k] + arr[k][j];13 }三、代码解释其实看上⾯的代码量和代码就知道这个算法很简单 =_=传⼊Floyd算法的参数是Graph G⾸先开辟⼀个⼆维数组arr[][],并且把图的邻接矩阵G.edge[][]赋值给arr[][],算法的主要思想就是来修改arr[][]值暴⼒出最短路径1int arr[G.vexnum][G.vexnum];//开辟数组arr[][]接收图G.edge[][]的值2for(int i = 0; i < G.vexnum; i++)3for(int j = 0; j < G.vexnum; i++)4 arr[i][j] = G.edge[i][j];//遍历赋值然后就是每次选择⼀个顶点k,再去找两个顶点i,j,对⽐看看是i→j的路径短,还是i→k→j的路径短也就是arr[i][j] 和 arr[i][k] + arr[k][j]两个的值谁的⽐较⼩,然后修改arr[][]⼀直到遍历完毕1for(int k; k < G.vexnum; k++)//选取k顶点2for(int i = 0; i < G.vexnum; i++)3for(int j = 0; j < G.vexnum; j++)//再选取i,j两个顶点4if(arr[i][j] > arr[i][k] + arr[k][j])//判断i→j的路径和i→k→j的路径谁⽐较短5 arr[i][j] = arr[i][k] + arr[k][j];//如果i→k→j的路径更短,则修改数组arr[][]写完感觉好短。
floyd算法求最短路径问题c语言
Floyd算法求最短路径问题一、背景介绍在图论中,最短路径是一个重要的研究领域。
最短路径问题可以归结为在一个有向带权图中寻找从一个顶点到另一个顶点的路径,使得路径上的所有边的权值之和最小。
解决最短路径问题的经典算法之一就是Floyd算法。
二、Floyd算法概述Floyd算法是一种动态规划算法,用于求解图中任意两个顶点之间的最短路径。
Floyd算法的基本思想是逐步地考虑图中所有的顶点作为中间节点,更新任意两个顶点之间的最短路径。
三、算法实现步骤Floyd算法的实现步骤如下:1.初始化距离矩阵:创建一个二维数组dist,用于存储任意两个顶点之间的最短路径距离。
如果存在一条直接的边连接两个顶点,则将对应位置的元素设为边的权值;否则,将对应位置的元素设为无穷大。
2.动态规划更新距离矩阵:利用三重循环遍历所有的顶点,每次循环都尝试通过当前顶点作为中间节点,更新任意两个顶点之间的最短路径距离。
具体地,对于任意的两个顶点i和j,如果存在另一个顶点k,使得经过顶点k的路径比直接连接的路径更短,则更新dist[i][j] = dist[i][k] + dist[k][j]。
3.输出最短路径:根据更新后的距离矩阵dist,可以轻松地得到任意两个顶点之间的最短路径。
四、算法复杂度分析Floyd算法的时间复杂度为O(N3),其中N表示图中顶点的个数。
Floyd算法的空间复杂度为O(N2),由于需要创建一个二维数组用于存储任意两个顶点之间的最短路径距离。
五、算法应用举例下面通过一个具体的例子来说明Floyd算法的应用。
假设有一个有向带权图,包含5个顶点和7条边,如下所示:2 30 ——► 1 ——► 2▲ / ▲ / ▲| / | /| / | /| / |/3 ——► 45图中顶点0到顶点2的最短路径为0→1→2,路径长度为5;顶点0到顶点3的最短路径为0→1→2→4→3,路径长度为11。
通过应用Floyd算法,我们可以得到所有顶点之间的最短路径。
floyd算法c语言实现
Floyd算法C语言实现1. 算法介绍Floyd算法,也称为弗洛伊德算法,是一种用于寻找图中所有节点之间最短路径的算法。
它通过不断更新节点之间的最短距离来求解最短路径问题。
Floyd算法是一种动态规划的算法,其核心思想是利用中间节点逐步优化路径。
Floyd算法的时间复杂度为O(n^3),其中n为图中节点的数量。
它适用于解决有向图或无向图中节点之间的最短路径问题,可以处理图中存在负权边的情况。
2. 算法原理Floyd算法通过一个二维数组来表示图的邻接矩阵,其中每个元素表示两个节点之间的距离。
算法的核心思想是,通过不断更新这个距离矩阵,使得每个节点之间的距离逐步优化,最终得到最短路径。
算法的具体步骤如下: 1. 初始化距离矩阵,将两个相邻节点之间的距离填入矩阵中,若两个节点之间无直接连接,则距离设为无穷大。
2. 对于每对节点i和j,以及每个中间节点k,检查是否存在从节点i经过节点k到节点j的路径,如果存在则更新距离矩阵中的距离。
3. 重复步骤2,逐步更新距离矩阵,直到所有节点之间的最短路径被找到。
3. 算法实现下面是Floyd算法的C语言实现代码:#include <stdio.h>#define INF 99999#define MAX_NODES 100void floyd(int graph[MAX_NODES][MAX_NODES], int num_nodes) {int i, j, k;// 初始化距离矩阵int dist[MAX_NODES][MAX_NODES];for (i = 0; i < num_nodes; i++) {for (j = 0; j < num_nodes; j++) {dist[i][j] = graph[i][j];}}// 逐步更新距离矩阵for (k = 0; k < num_nodes; k++) {for (i = 0; i < num_nodes; i++) {for (j = 0; j < num_nodes; j++) {if (dist[i][k] + dist[k][j] < dist[i][j]) { dist[i][j] = dist[i][k] + dist[k][j]; }}}}// 打印最短路径矩阵printf("最短路径矩阵:\n");for (i = 0; i < num_nodes; i++) {for (j = 0; j < num_nodes; j++) {if (dist[i][j] == INF) {printf("INF ");} else {printf("%d ", dist[i][j]);}}printf("\n");}}int main() {int num_nodes, i, j;int graph[MAX_NODES][MAX_NODES];printf("请输入节点的数量:");scanf("%d", &num_nodes);printf("请输入图的邻接矩阵:\n");for (i = 0; i < num_nodes; i++) {for (j = 0; j < num_nodes; j++) {scanf("%d", &graph[i][j]);}}floyd(graph, num_nodes);return 0;}4. 算法测试我们来测试一下上述代码的运行结果。
Floyd算法——最短路径算法_C语言实现_阿涵_新浪博客
for(i=0;i<n;i++){//初始化
for(j=0;j<n;j++){
if(G->A[i][j]<MAX_INT){
path[i][j]=j;
}else{
path[i][j]=-1;
}
D[i][j]=G->A[i][j];
}
}
for(k=0;k<n;k++){//进行n次试探
}MGraph;//邻接矩阵表示的图
//Floyd算法
//求网G(用邻接矩阵表示)中任意两点间最短路径
//D[][]是最短路径长度矩阵,path[][]最短路径标志矩阵
void Floyd(MGraph * G,int path[][MAX_VERTEX_NUM],int D[][MAX_VERTEX_NUM],int n){
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(D[i][j]>D[i][k]+D[k][j]){
D[i][j]=D[i][k]+D[k][j];//取小者
path[i][j]=path[i][k];//改Vi的后继
}
}
}
}
}
int main(){
int i,j,k,v=0,n=6;//v为起点,n为顶点个数
刘启诚
与客户共同创新(一)
惠普中国研究院
有一种生活叫“Smarter lif络低俗广告的鉴定标准
阿祥
告诉大家一个更加透明的华为
最短路径Floyd算法
摘要: 确定图的路由选择的策略要考虑很多技术因素。其包括:选择最短路由还是最佳路由;Floyd 提出图的求每一对顶点之间最短路径的方法,由于好多教材采用的是字符界面算法演示,不 是很直观,而且不符合当前 windows 界面编程趋势。为此,经过反复的探索和实践,充分 结合 VC++强大而灵活的编程模式,基于对话框 MFC,成功完成看似颇难的任务。为后续的 进一步演变,创造了一个良好的基础原型。
由于好多教材采用的是字符界面算法演示,不是很直观,而且不符合当前 windows 界面 编程趋势。为此,经过反复的探索和实践,充分结合 VC++强大而灵活的编程模式,基于对 话框 MFC,成功完成看似颇难的任务。 从下图界面可知,此带权有向图顶点假设为 V0,V1,…V18,V19,共20个,两点之间有单向 的,也有双向的。有向图实际分成两个不相通的两部分。如果用户任选两个顶点,比如 V0 及V13(注意:先点击 V0 的为源点,后点击的V13 为目的点,超过两个或一个无效),然 后点击开始按钮,通过后台的一系列界面事件处理代码及 Floyd(弗洛伊德)算法运算,然 后 把 路 径 显 示 在 相 应 窗 口 中 , 比 如 13<<9<<5<<6<<4<<0 , 它 代 表 路 径 为 : V0->V4->V6->V5->V9->V13 同时。路径总长为 47。如果两顶点不通,路径及总长度无效。
public: void ShortestPath_Dijkstra(int ,int); int choose(int); }; void Graph::ShortestPath_ Dijkstra(int n ,int v) {
弗洛伊德算法c语言
弗洛伊德算法c语言弗洛伊德算法(Floyd algorithm),又称为插点法,解决的是任意两点之间的最短路径问题,能够处理有向图或负权边的情况。
下面是使用c语言实现弗洛伊德算法的示例代码:```c。
#include <stdio.h>。
#include <stdlib.h>。
#define INF 99999 // 代表不连通。
void floyd(int **adj, int n) 。
int i, j, k;。
//先进行初始化。
for(i = 0; i < n; i++) 。
for(j = 0; j < n; j++) 。
if(adj[i][j] == 0) { // 如果是没有连通的,则初始化为无穷大。
adj[i][j] = INF;。
}。
}。
}。
//进行动态规划。
for(k = 0; k < n; k++) { // 可以理解为依次插入节点。
for(i = 0; i < n; i++) 。
for(j = 0; j < n; j++) 。
if(adj[i][j] > adj[i][k] + adj[k][j]) 。
adj[i][j] = adj[i][k] + adj[k][j];。
}。
}。
}。
}。
}。
int main() 。
int n, m;。
printf("请输入节点的数量:");。
scanf("%d", &n);。
printf("请输入边的数量:");。
scanf("%d", &m);。
printf("请输入每条边的起点、终点、长度:\n");。
int **adj = (int **)malloc(sizeof(int *) * n);。
int i, j;。
for(i = 0; i < n; i++) 。
Floyd算法简单实现(C++)
Floyd算法简单实现(C++)图的最短路径问题主要包括三种算法:(1)(2)(3)Bellman (含有负权边的单源最短路径)本⽂主要讲使⽤C++实现简单的Floyd算法,Floyd算法原理参见Floyd算法简单实现(C++)1 #include<iostream>2using namespace std;34#define MAXVEX 105#define INFINITY 6553567 typedef int Patharc[MAXVEX][MAXVEX];8 typedef int ShortPathTable[MAXVEX][MAXVEX];910 typedef struct {11int vex[MAXVEX];12int arc[MAXVEX][MAXVEX];13int numVertexes;14 } MGraph;1516// 构建图17void CreateMGraph(MGraph *G){18int i, j, k;1920// 初始化图21 G->numVertexes = 9;22for(i = 0; i < G->numVertexes; ++i){23 G->vex[i] = i;24 }25for(i = 0; i < G->numVertexes; ++i){26for(j = 0; j < G->numVertexes; ++j){27if(i == j)28 G->arc[i][j] = 0;29else30 G->arc[i][j] = G->arc[j][i] = INFINITY;31 }32 }3334 G->arc[0][1] = 1;35 G->arc[0][2] = 5;3637 G->arc[1][2] = 3;38 G->arc[1][3] = 7;39 G->arc[1][4] = 5;4041 G->arc[2][4] = 1;42 G->arc[2][5] = 7;4344 G->arc[3][4] = 2;45 G->arc[3][6] = 3;4647 G->arc[4][5] = 3;48 G->arc[4][6] = 6;49 G->arc[4][7] = 9;5051 G->arc[5][7] = 5;5253 G->arc[6][7] = 2;54 G->arc[6][8] = 7;5556 G->arc[7][8] = 4;5758// 设置对称位置元素值59for(i = 0; i < G->numVertexes; ++i){60for(j = i; j < G->numVertexes; ++j){61 G->arc[j][i] = G->arc[i][j];62 }63 }64 }6566// Floyd algorithm67void ShortPath_Floyd(MGraph G, Patharc P, ShortPathTable D){68int i, j, k;69// ⼆重循环,初始化P, D70for(i = 0; i < G.numVertexes; ++i){71for(j = 0; j < G.numVertexes; ++j){72 D[i][j] = G.arc[i][j];73 P[i][j] = j;74 }75 }76// 三重循环, Floyd algorithm77for(k = 0; k < G.numVertexes; ++k){78for(i = 0; i < G.numVertexes; ++i){79for(j = 0; j < G.numVertexes; ++j){80if(D[i][j] > D[i][k]+D[k][j]){81 D[i][j] = D[i][k]+D[k][j];82 P[i][j] = P[i][k];83 }84 }85 }86 }87 }8889// 打印最短路径90void PrintShortPath(MGraph G, Patharc P, ShortPathTable D){91int i, j, k;92 cout<<"各顶点之间的最短路径如下: "<<endl;93for(i = 0; i < G.numVertexes; ++i){94for(j = i+1; j < G.numVertexes; ++j){95 cout<<"v"<<i<<"--"<<"v"<<j<<""<<"weight: "<<D[i][j]<<" Path: "<<i<<" -> ";96 k = P[i][j];97while(k != j){98 cout<<k<<" -> ";99 k = P[k][j];100 }101 cout<<j<<endl;102 }103 cout<<endl;104 }105 }106107int main(int argc, char const *argv[]) {108 MGraph G;109 Patharc P;110 ShortPathTable D;111 CreateMGraph(&G);112 ShortPath_Floyd(G, P, D);113 PrintShortPath(G, P, D);114return0;115 }运⾏结果:各顶点之间的最短路径如下:v0--v1 weight: 1 Path: 0 -> 1v0--v2 weight: 4 Path: 0 -> 1 -> 2v0--v3 weight: 7 Path: 0 -> 1 -> 2 -> 4 -> 3v0--v4 weight: 5 Path: 0 -> 1 -> 2 -> 4v0--v5 weight: 8 Path: 0 -> 1 -> 2 -> 4 -> 5v0--v6 weight: 10 Path: 0 -> 1 -> 2 -> 4 -> 3 -> 6v0--v7 weight: 12 Path: 0 -> 1 -> 2 -> 4 -> 3 -> 6 -> 7v0--v8 weight: 16 Path: 0 -> 1 -> 2 -> 4 -> 3 -> 6 -> 7 -> 8v1--v2 weight: 3 Path: 1 -> 2v1--v3 weight: 6 Path: 1 -> 2 -> 4 -> 3v1--v4 weight: 4 Path: 1 -> 2 -> 4v1--v5 weight: 7 Path: 1 -> 2 -> 4 -> 5v1--v6 weight: 9 Path: 1 -> 2 -> 4 -> 3 -> 6v1--v7 weight: 11 Path: 1 -> 2 -> 4 -> 3 -> 6 -> 7v1--v8 weight: 15 Path: 1 -> 2 -> 4 -> 3 -> 6 -> 7 -> 8v2--v3 weight: 3 Path: 2 -> 4 -> 3v2--v4 weight: 1 Path: 2 -> 4v2--v5 weight: 4 Path: 2 -> 4 -> 5v2--v6 weight: 6 Path: 2 -> 4 -> 3 -> 6v2--v7 weight: 8 Path: 2 -> 4 -> 3 -> 6 -> 7v2--v8 weight: 12 Path: 2 -> 4 -> 3 -> 6 -> 7 -> 8v3--v4 weight: 2 Path: 3 -> 4v3--v5 weight: 5 Path: 3 -> 4 -> 5v3--v6 weight: 3 Path: 3 -> 6v3--v7 weight: 5 Path: 3 -> 6 -> 7v3--v8 weight: 9 Path: 3 -> 6 -> 7 -> 8v4--v5 weight: 3 Path: 4 -> 5v4--v6 weight: 5 Path: 4 -> 3 -> 6v4--v7 weight: 7 Path: 4 -> 3 -> 6 -> 7v4--v8 weight: 11 Path: 4 -> 3 -> 6 -> 7 -> 8 v5--v6 weight: 7 Path: 5 -> 7 -> 6v5--v7 weight: 5 Path: 5 -> 7v5--v8 weight: 9 Path: 5 -> 7 -> 8v6--v7 weight: 2 Path: 6 -> 7v6--v8 weight: 6 Path: 6 -> 7 -> 8v7--v8 weight: 4 Path: 7 -> 8[Finished in1.2s]参考资料:。
用floyd算法求每对顶点间的最短路,矩阵c语言
用floyd算法求每对顶点间的最短路,矩阵c语言Floyd算法是一种动态规划算法,用于求解每对顶点间的最短路径问题。
以下是一个用C语言实现的Floyd算法示例:```cinclude <>include <>define V 5 // 顶点数int graph[V][V]; // 邻接矩阵表示的图int dist[V][V]; // 最短路径矩阵// 初始化邻接矩阵和最短路径矩阵void init() {for (int i = 0; i < V; i++) {for (int j = 0; j < V; j++) {graph[i][j] = INT_MAX; // 初始化为无穷大dist[i][j] = INT_MAX; // 初始化为无穷大}}}// 计算最短路径void floyd() {init(); // 初始化邻接矩阵和最短路径矩阵for (int k = 0; k < V; k++) {for (int i = 0; i < V; i++) {for (int j = 0; j < V; j++) {if (graph[i][k] + graph[k][j] < graph[i][j]) {dist[i][j] = graph[i][k] + graph[k][j]; // 更新最短路径矩阵 }}}}}int main() {int i, j, k;init(); // 初始化邻接矩阵和最短路径矩阵// 初始化邻接矩阵graph[0][1] = 2; // 0->1的距离为2graph[0][2] = 3; // 0->2的距离为3graph[1][2] = 1; // 1->2的距离为1graph[1][3] = 4; // 1->3的距离为4graph[2][3] = 2; // 2->3的距离为2graph[2][4] = 5; // 2->4的距离为5graph[3][4] = 1; // 3->4的距离为1floyd(); // 使用Floyd算法计算最短路径矩阵printf("The Floyd algorithm finds the shortest path matrix:\n"); for (i = 0; i < V; i++) {for (j = 0; j < V; j++) {printf("%d ", dist[i][j]); // 输出最短路径矩阵中的元素值}printf("\n");}return 0;}```。
基于Floyd算法的最短路径问题的求解c++
摘要现实生活中许多实际问题的解决依赖于最短路径的应用,其中比较常用的是floyd 算法。
通过floyd算法使最短路径问题变得简单化。
采用图的邻接矩阵或邻接表实现最短路径问题中图的存储。
采用Visual C++6.0的控制台工程和MFC工程分别实现基于floyd算法求最短路径的应用。
关键词:最短路径;floyd算法;邻接矩阵;MFC工程目录1需求分析 (1)2算法基本原理 (1)2.1邻接矩阵 (1)2.2弗洛伊德算法 (2)3类设计 (3)3.1类的概述 (3)3.2类的接口设计 (3)3.3类的实现 (4)4基于控制台的应用程序 (7)4.1主函数设计 (7)4.2运行结果及分析 (8)5基于MFC的应用程序 (9)5.1图形界面设计 (9)5.1程序代码设计 (11)5.3运行结果及分析 (20)结论 (22)参考文献 (23)1需求分析Floyd算法又称为插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法。
该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。
假若要在计算机上建立一个交通咨询系统则可以采用图的结构来表示实际的交通网络。
这个资讯系统可以回答游客提出的各种问题。
例如,一位旅客要从A城到B城,他希望选择一条途中中转次数最少的路线。
假设图中每一站都需要换车,则这个问题反映到图上就是要找一条从顶点A到B所含边的数目最少的路径。
我们只需从顶点A出发对图作广度优先搜索,一旦遇到顶点B就终止。
由此所得广度优先生成树上,从根顶点A到顶点B的路径就是中转次数最少的路径,路径上A与B之间的顶点就是途径中的中转站数。
但是这只是一类最简单的图的最短路径的问题。
有时对于旅客来说,可能更关心的是节省交通费用;对于司机来说里程和速度则是他们感兴趣的信息。
为了在图上标示有关信息可对边赋以权的值,权的值表示两城市间的距离,或图中所需时间,或交通费用等等。
floyd算法求最短路径问题的步骤
floyd算法求最短路径问题的步骤Floyd算法是一种用于求解最短路径问题的动态规划算法。
它能够计算出任意两点之间的最短路径长度,并且可以同时得到最短路径的具体路径。
下面是Floyd算法求解最短路径问题的步骤:
1. 创建一个二维数组dist,用于存储任意两点之间的最短路径长度。
初始化时,将所有的元素设为无穷大(表示不可达),但对角线上的元素设为0。
2. 创建一个二维数组path,用于存储任意两点之间最短路径的中间节点。
初始化时,将所有的元素设为-1。
3. 根据给定的图或者网络,将直接相连的两个节点之间的距离填入`dist`数组中。
如果两个节点之间不存在边,则将距离设为无穷大。
4. 使用三重循环进行计算。
外层循环遍历所有可能的中间节点,中间层循环遍历所有可能的起始节点,内层循环遍历所有可能的目标节点。
如果通过中间节点k可以使得从起始节点i到目标节点j的路径更短,即dist[i][k] + dist[k][j] < dist[i][j],则更新dist[i][j]为新的最短路径长度,并更新path[i][j]为中间节点k。
5. 循环结束后,dist数组中存储的就是任意两点之间的最短路径长度,path数组中存储的是最短路径的中间节点。
6. 如果需要获取具体的最短路径,可以通过回溯path数组来获取。
以起始节点i和目标节点j为例,可以通过不断查找path[i][j],直到找到-1为止,得到最短路径
的节点序列。
以上就是Floyd算法求解最短路径问题的步骤。
该算法的时间复杂度为O(n^3),其中n为节点的数量。
Floyd最短路径算法
Floyd最短路径算法Floyd最短路径算法2006-10-20, by leon_jlu 在图论中经常会遇到这样的问题,在一个有向图里,求出任意两个节点之间的最短距离。
我们在离散数学、数据结构课上都遇到过这个问题,在计算机网络里介绍网络层的时候好像也遇到过这个问题,记不请了... 但是书本上一律采取的是Dijkstra算法,通过Dijkstra算法可以求出单源最短路径,然后逐个节点利用Dijkstra算法就可以了。
不过在这里想换换口味,采取Robert Floyd提出的算法来解决这个问题。
下面让我们先把问题稍微的形式化一下:如果有一个矩阵D=[d(ij)],其中d(ij)>0表示i城市到j城市的距离。
若i与j之间无路可通,那么d(ij)就是无穷大。
又有d(ii)=0。
编写一个程序,通过这个距离矩阵D,把任意两个城市之间的最短与其行径的路径找出来。
我们可以将问题分解,先找出最短的距离,然后在考虑如何找出对应的行进路线。
如何找出最短路径呢,这里还是用到动态规划的知识,对于任何一个城市而言,i到j的最短距离不外乎存在经过i与j之间的k和不经过k两种可能,所以可以令k=1,2,3,...,n(n是城市的数目),在检查d(ij)与d(ik)+d(kj)的值;在此d(ik)与d(kj)分别是目前为止所知道的i到k与k到j的最短距离,因此d(ik)+d(kj)就是i到j经过k的最短距离。
所以,若有d(ij)>d(ik)+d(kj),就表示从i出发经过k 再到j的距离要比原来的i到j距离短,自然把i到j的d(ij)重写为d(ik)+d(kj),每当一个k查完了,d(ij)就是目前的i到j的最短距离。
重复这一过程,最后当查完所有的k时,d(ij)里面存放的就是i到j之间的最短距离了。
所以我们就可以用三个for循环把问题搞定了,但是有一个问题需要注意,那就是for循环的嵌套的顺序:我们可能随手就会写出这样的程序,但是仔细考虑的话,会发现是有问题的。
基于floyd算法的最短路径问题的求解c1
摘要现实生活中许多实际问题的解决依赖于最短路径的应用,其中比较常用的是floyd 算法。
通过floyd算法使最短路径问题变得简单化。
采用图的邻接矩阵或邻接表实现最短路径问题中图的存储。
采用Visual C++6.0的控制台工程和MFC工程分别实现基于floyd算法求最短路径的应用。
关键词:最短路径;floyd算法;邻接矩阵;MFC工程目录1需求分析 ............................................................................................. 错误!未定义书签。
2算法基本原理 ..................................................................................... 错误!未定义书签。
2.1邻接矩阵 .......................................................................................... 错误!未定义书签。
2.2弗洛伊德算法 .................................................................................. 错误!未定义书签。
3类设计 ................................................................................................. 错误!未定义书签。
3.1类的概述 .......................................................................................... 错误!未定义书签。
数据结构floyd算法求最短路径
数据结构floyd算法求最短路径一、简介Floyd算法是一种用于求解图中任意两点之间最短路径的算法,也称为插点法。
它采用动态规划的思想,通过不断地添加中间节点来逐步求解最短路径。
Floyd算法的时间复杂度为O(n^3),适用于较小规模的图。
二、基本思想Floyd算法通过一个二维数组来存储任意两点之间的最短距离,初始化时,该数组存储的是图中各个节点之间的直接距离。
然后,对于每一个中间节点k,遍历整个二维数组,并更新任意两个节点i和j之间的距离,使得i到j经过k时距离更小。
最终得到的二维数组就是任意两点之间的最短距离。
三、具体实现1. 初始化二维数组D,D[i][j]表示节点i到节点j的直接距离。
2. 三重循环遍历整个二维数组D,在每次循环中将节点k作为中转节点,更新D[i][j]。
3. 更新公式:D[i][j] = min(D[i][j], D[i][k]+D[k][j])。
4. 循环结束后得到的二维数组就是任意两点之间的最短距离。
四、代码实现```void floyd(int n, int D[][MAX]){for(int k=1; k<=n; k++){for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){D[i][j] = min(D[i][j], D[i][k]+D[k][j]);}}}}```五、应用场景Floyd算法适用于较小规模的图,一般用于解决稠密图(边数接近节点数平方)中任意两点之间的最短路径问题。
它可以用于计算城市间的最短路程、网络中的最短路径等。
六、优缺点分析优点:1. 算法思想简单,易于理解和实现。
2. 可以求解任意两点之间的最短路径。
3. 时间复杂度为O(n^3),适用于较小规模的图。
缺点:1. 空间复杂度较高,需要开辟二维数组存储各个节点之间的距离。
2. 对于大规模稀疏图,算法效率较低。
3. 无法处理存在负权回路的图。
c语言最短路径
c语言最短路径C语言是一种广泛应用于软件开发和系统编程的高级编程语言。
在C语言中,最短路径是一种常见的算法问题,它在各种应用场景中都有着重要的作用。
本文将介绍C语言中最短路径的概念和常见的解决方法。
最短路径问题可以描述为在一个图中找到一条路径,使得经过该路径的总权重最小。
在实际应用中,最短路径问题有很多种变体,如有向图、无向图、带权图等。
其中最常见的算法是Dijkstra算法和Floyd-Warshall算法。
Dijkstra算法是一种用于解决单源最短路径问题的贪心算法。
它的基本思想是从起始节点开始,逐步选择与当前节点距离最短的邻接节点,直到找到终点或者遍历完所有节点。
Dijkstra算法使用了一个距离数组来保存每个节点到起始节点的最短距离,同时使用一个优先队列来选择下一个要访问的节点。
通过不断更新距离数组和优先队列,最终可以得到起始节点到其他所有节点的最短路径。
Floyd-Warshall算法是一种用于解决全源最短路径问题的动态规划算法。
它通过一个二维数组来保存任意两个节点之间的最短距离,然后通过遍历所有节点,逐步更新这个二维数组,最终得到任意两个节点之间的最短路径。
Floyd-Warshall算法的时间复杂度较高,但在节点数不多的情况下仍然可以快速求解最短路径问题。
除了Dijkstra算法和Floyd-Warshall算法,还有其他一些常见的最短路径算法,如Bellman-Ford算法、A*算法等。
每种算法都有其适用的场景和特点,开发者可以根据具体的需求选择合适的算法来解决最短路径问题。
在实际应用中,最短路径算法被广泛应用于各种领域。
例如,在地图导航系统中,我们可以使用最短路径算法来规划最优的行车路线;在网络通信中,最短路径算法可以用于路由选择,使数据能够快速传输;在物流配送中,最短路径算法可以帮助我们优化送货路线,节省时间和成本。
最短路径是C语言中一个重要的问题,有多种解决方法可供选择。
开发者可以根据具体的应用场景和需求,选择合适的算法来解决最短路径问题。
数学建模floyd算法最短路算法详解ppt课件
选址问题--重心问题
例 3 某 矿 区 有 七 个 矿 点 , 如 图 所 示 . 已 知 各 矿 点 每 天 的 产 矿 量
q ( v j) ( 标 在 图 的 各 顶 点 上 ) . 现 要 从 这 七 个 矿 点 选 一 个 来 建 造 矿 厂 . 问
应 选 在 哪 个 矿 点 , 才 能 使 各 矿 点 所 产 的 矿 运 到 选 矿 厂 所 在 地 的 总 运 力
floyd算法查找最短路路径的方法一算法的基本思想三算法步骤算法的基本思想直接在图的带权邻接矩阵中用插入顶点的方法依次构造出成为图的距离矩阵同时也求出插入点矩阵以便得到两点间的最短路径
最短路算法
恣意一对顶点之间的最短路算法:Floyd算法
〔一〕算法的根本思想
( ) 1、求间隔矩阵的方法 2、求途径矩阵的方法 3、查找最短路途径的方法
算法原理—— 求途径矩阵的方法
在建立间隔矩阵的同时可建立途径矩阵R.
R = ( r i ) , j r i j 的 含 义 是 从 v i 到 v j 的 最 短 路 要 经 过 点 号 为 r i j 的 点 .
R ( 0 ) ( r i ( 0 ) ) , r j i ( 0 ) j j
d i ( 2 ) j 是 从 v i 到 v j 的 只 允 许 以 v 1 、 v 2 作 为 中 间 点 的 路 径 中 最 短 路 的 长 度 .
…
( ) D ( ) = ( d i ( ) j) , 其 中 d i ( ) j m d i ( j1 i ),d n i ( 1 ) { d ( j 1 ) }
选址问题--中心问题
例 2 某 城 市 要 建 立 一 个 消 防 站 , 为 该 市 所 属 的 七 个 区 服 务 ,
Floyd算法解决全源最短路径问题
Floyd算法解决全源最短路径问题Floyd算法是一种用于解决全源最短路径问题的图算法。
它能够计算出任意两点之间的最短路径距离,并且可以处理带有负权边的图。
本文将详细介绍Floyd算法的原理和应用,并给出一个实际案例以帮助读者更好地理解。
一、Floyd算法的原理Floyd算法基于动态规划的思想,通过逐步更新图中各顶点之间的最短路径距离来寻找全源最短路径。
其具体步骤如下:1. 初始化距离矩阵D,其中D[i][j]表示顶点i到顶点j的最短路径距离。
若存在直接连接的边,则将其权值作为距离;若没有直接连接的边,则将距离设为无穷大。
2. 对于每对顶点i和j,以及顶点k作为中间节点,如果从i到k再到j的路径距离比当前的最短路径距离小,则更新距离矩阵D[i][j]的值。
3. 重复以上步骤,直到距离矩阵D不再发生变化。
最终,距离矩阵D中的每个元素D[i][j]即为从顶点i到顶点j的最短路径距离。
二、Floyd算法的应用Floyd算法在实际中有着广泛的应用,例如路由选择、交通规划和网络优化等领域。
下面通过一个实例来说明Floyd算法的应用过程。
假设有一个城市间的交通网络,共有n个城市,每两个城市之间的距离用矩阵表示如下:|A B C---------------A |0 5 ∞B |2 0 3C |∞ 1 0其中∞代表两个城市之间没有直接连接的边。
我们需要通过Floyd算法计算出任意两点之间的最短路径距离。
初始化距离矩阵D如下:|A B C---------------A |0 5 ∞B |2 0 3C |∞ 1 0首先考虑顶点A和顶点B之间的最短路径,由于A和B之间存在直接连接的边,因此D[1][2]的值为5。
然后,将顶点C作为中间节点,检查从A到C再到B的路径是否比当前的最短路径更短,发现不是,所以D[1][2]的值保持不变。
接下来,我们依次考虑其他的顶点对,通过逐步更新距离矩阵D来计算最短路径距离。
经过多次迭代后,得到最终的距离矩阵D如下: |A B C---------------A |0 3 6B |2 0 3C |3 1 0最终的距离矩阵D表示每对顶点之间的最短路径距离,例如D[1][2]表示从顶点1(A)到顶点2(B)的最短路径距离为3。
C语言floyd算法求最短路径并输出路线
3 4 15
4 1 15
4 3 5
floyd(dist, path, n);
display_path(dist, path, n);
getchar();
}
//程序测试
Input the path information:
--------------------------------------
}
}
void display_path(int dist[][MAXSIZE], int path[][MAXSIZE], int n)
{
int *chain;
int count;
int i, j, k;
printf("->%d", chain[k]+1);
printf("->%d", j+1);
}
}
}
k = j;
do
{
k = chain[count++] = path[i][k];
Hale Waihona Puke } while (i != k);
0 0 0
对应的输出结果为:
Origin->Dest Dist Path
----------------------------------------------
1->2 5 1->2
{
for (j = 0; j < n; j++)
dist[i][j] = INT_MAX;
dist[i][i] = 0;
}
C语言求所有顶点对之间的最短路径:FLOYD算法
C语⾔求所有顶点对之间的最短路径:FLOYD算法所有顶点对之间的最短路径问题是:对于给定的有向⽹络G=(V,E),要对G中任意两个顶点v,w(v不等于w),找出v到w的最短路径。
当然我们可以n次执⾏DIJKSTRA算法,⽤FLOYD则更为直接,两种⽅法的时间复杂度都是⼀样的。
有向⽹络⽤邻接矩阵存储,以下⾯的有向⽹络为例:源程序清单:#include<stdio.h>#define n 5 //结点数⽬#define maxsize 160 //表⽰两点间不可达int path[n][n];//路径矩阵void floyd(int A[][n],int C[][n]); //A是路径长度矩阵,C是有向⽹络G的带权邻接矩阵void main(){printf(" ——所有顶点对之间的最短路径:Floyd算法——\n");printf("(160为⽆穷远,不可达)\n");int A[n][n],C[n][n]={{0,10,maxsize,30,100},{maxsize,0,50,maxsize,maxsize},{maxsize,maxsize,0,maxsize,10},{maxsize,maxsize,20,0,60},{maxsize,maxsize,maxsize,maxsize,0}};floyd(A,C);}void floyd(int A[][n],int C[][n]) //A是路径长度矩阵,C是有向⽹络G的带权邻接矩阵{int i,j,k,next;int max=160;for(i=0;i<n;i++)//设置A和path的初值{for(j=0;j<n;j++){if(C[i][j]!=max)path[i][j]=j; //j是i的后继elsepath[i][j]=0;A[i][j]=C[i][j];}}for(k=0;k<n;k++)//做n次迭代,每次均试图将顶点k扩充到当前求得的从i到j的最短路径Pij上{for(i=0;i<n;i++){for(j=0;j<n;j++){if(A[i][j]>(A[i][k]+A[k][j])){A[i][j]=A[i][k]+A[k][j]; //修改长度path[i][j]=path[i][k]; //修改路径}}}}for(i=0;i<n;i++)//输出所有顶点对i,j之间的最短路径Pij的长度及路径 {for(j=0;j<n;j++){if(i!=j){printf("%d到%d的最短距离为",i+1,j+1);printf("%d\n",A[i][j]); //输出Pij的长度next=path[i][j]; //next为起点i的后继顶点printf("输出路径:\n");if(next==0)printf("%d到%d不可达\n",i+1,j+1);else//Pij存在{printf("%d",i+1);while(next!=j){printf("——>%d",next+1); //打印后继点next=path[next][j]; //继续找下⼀个后继点}printf("——>%d\n",j+1); //打印终点}printf("****************************************************\n");}}}}运⾏结果:——所有顶点对之间的最短路径:Floyd算法——(160为⽆穷远,不可达)1到2的最短距离为10输出路径:1——>2****************************************************1到3的最短距离为50输出路径:1——>4——>3****************************************************1到4的最短距离为30输出路径:1——>4****************************************************1到5的最短距离为60输出路径:1——>4——>3——>5****************************************************2到1的最短距离为160输出路径:2到1不可达****************************************************2到3的最短距离为50输出路径:2——>3****************************************************2到4的最短距离为160输出路径:2到4不可达**************************************************** 2到5的最短距离为60输出路径:2——>3——>5**************************************************** 3到1的最短距离为160输出路径:3到1不可达**************************************************** 3到2的最短距离为160输出路径:3到2不可达**************************************************** 3到4的最短距离为160输出路径:3到4不可达**************************************************** 3到5的最短距离为10输出路径:3——>5**************************************************** 4到1的最短距离为160输出路径:4到1不可达**************************************************** 4到2的最短距离为160输出路径:4到2不可达**************************************************** 4到3的最短距离为20输出路径:4——>3**************************************************** 4到5的最短距离为30输出路径:4——>3——>5**************************************************** 5到1的最短距离为160输出路径:5到1不可达**************************************************** 5到2的最短距离为160输出路径:5到2不可达**************************************************** 5到3的最短距离为160输出路径:5到3不可达**************************************************** 5到4的最短距离为160输出路径:5到4不可达****************************************************请按任意键继续. . .。
floyed算法 例题
floyed算法例题
弗洛伊德算法(Floyd's Algorithm),也称为弗洛伊德-沃舍尔算法(Floyd-Warshall Algorithm),是一种用于求解所有顶点对最短路径的动态规划算法。
它可以在有向图或带权图中计算出任意两个顶点之间的最短路径。
下面是一个使用弗洛伊德算法求解最短路径的简单例题:
假设有一个带权有向图如下所示:
图中的边上显示了权重,表示从一个顶点到另一个顶点的距离或代价。
我们要使用弗洛伊德算法计算出所有顶点之间的最短路径。
1.初始化距离矩阵,对于图中的边,用实际的权重赋值;对
于不可达的边,用一个很大的数(例如9999)表示。
2.使用弗洛伊德算法更新距离矩阵。
逐个顶点遍历,以k作
为中介顶点,在i、j两个顶点之间比较是否有更短的路径,
如果有则更新距离矩阵。
o k = A:
o k = B:
o k = C:
o k = D:
3.根据最终的距离矩阵,我们可以得到所有顶点之间的最短
路径。
使用矩阵的对角线元素,可以看出最短路径为:
o A到A的最短路径长度为0;
o A到B的最短路径长度为2,最短路径为A -> B;
o A到C的最短路径长度为1,最短路径为A -> C;
o A到D的最短路径长度为3,最短路径为A -> C -> D。
同样的,我们可以得到其他顶点之间的最短路径。
弗洛伊德算法通过动态规划的方式,逐步优化所有顶点之间的最短路径,时间复杂度为O(V^3),其中V为顶点的数量。
这使得它非常适用于解决小规模的图的最短路径问题。
c语言实现弗洛伊德算法
c语言实现弗洛伊德算法弗洛伊德算法,也称为Floyd-Warshall算法,是一种用于求解所有节点对之间最短路径的动态规划算法。
该算法的时间复杂度为O(n^3),适用于有向图或无向图,可以处理负权边但不能处理负环。
在C语言中,我们可以使用二维数组来表示图的邻接矩阵,其中matrix[i][j]表示从节点i到节点j的边权值。
我们可以使用三重循环来实现弗洛伊德算法,其中第一重循环枚举中间节点k,第二重循环枚举起点i,第三重循环枚举终点j。
具体实现如下:```cvoid floyd(int n, int matrix[][n]) {int i, j, k;for (k = 0; k < n; k++) {for (i = 0; i < n; i++) {for (j = 0; j < n; j++) {if (matrix[i][k] + matrix[k][j] < matrix[i][j]) {matrix[i][j] = matrix[i][k] + matrix[k][j];}}}}}```在上述代码中,n表示节点数,matrix为邻接矩阵。
我们首先枚举中间节点k,然后枚举起点i和终点j,如果从i到k再到j的路径比当前的i到j路径更短,则更新i到j的路径长度。
最终,matrix[i][j]中存储的就是节点i到节点j的最短路径长度。
需要注意的是,如果图中存在负环,则该算法会陷入死循环。
因此,在实际应用中,我们需要先判断图中是否存在负环,如果存在则无法使用弗洛伊德算法。
弗洛伊德算法是一种非常实用的动态规划算法,可以用于求解所有节点对之间的最短路径。
在C语言中,我们可以使用邻接矩阵来表示图,并使用三重循环来实现该算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要现实生活中许多实际问题的解决依赖于最短路径的应用,其中比较常用的是floyd 算法。
通过floyd算法使最短路径问题变得简单化。
采用图的邻接矩阵或邻接表实现最短路径问题中图的存储。
采用Visual C++6.0的控制台工程和MFC工程分别实现基于floyd算法求最短路径的应用。
关键词:最短路径;floyd算法;邻接矩阵;MFC工程目录1需求分析 (1)2算法基本原理 (1)2.1邻接矩阵 (1)2.2弗洛伊德算法 (2)3类设计 (2)3.1类的概述 (2)3.2类的接口设计 (3)3.3类的实现 (4)4基于控制台的应用程序 (7)4.1主函数设计 (7)4.2运行结果及分析 (8)5基于MFC的应用程序 (9)5.1图形界面设计 (9)5.1程序代码设计 (11)5.3运行结果及分析 (20)结论 (21)参考文献 (22)1需求分析Floyd算法又称为插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法。
该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。
假若要在计算机上建立一个交通咨询系统则可以采用图的结构来表示实际的交通网络。
这个资讯系统可以回答游客提出的各种问题。
例如,一位旅客要从A城到B城,他希望选择一条途中中转次数最少的路线。
假设图中每一站都需要换车,则这个问题反映到图上就是要找一条从顶点A到B所含边的数目最少的路径。
我们只需从顶点A出发对图作广度优先搜索,一旦遇到顶点B就终止。
由此所得广度优先生成树上,从根顶点A到顶点B的路径就是中转次数最少的路径,路径上A与B之间的顶点就是途径中的中转站数。
但是这只是一类最简单的图的最短路径的问题。
有时对于旅客来说,可能更关心的是节省交通费用;对于司机来说里程和速度则是他们感兴趣的信息。
为了在图上标示有关信息可对边赋以权的值,权的值表示两城市间的距离,或图中所需时间,或交通费用等等。
此时路径长度的量度就不再是路径上边的数目,而是路径上边的权值之和。
边赋以权值之后再结合最短路径算法来解决这些实际问题。
Floyd算法是最短路径经典算法中形式较为简单,便于理解的一种。
2算法基本原理2.1 邻接矩阵邻接矩阵(Adjacency Matrix):是表示顶点之间相邻关系的矩阵。
设G=(V,E)是一个图,其中V={v1,v2,…,vn}。
G的邻接矩阵是一个具有下列性质的n阶方阵:(1)对无向图而言,邻接矩阵一定是对称的,而且对角线一定为零(在此仅讨论无向简单图),有向图则不一定如此。
(2)在无向图中,任一顶点i的度为第i列所有元素的和,在有向图中顶点i的出度为第i行所有元素的和,而入度为第i列所有元素的和。
(3)用邻接矩阵法表示图共需要个空间,由于无向图的邻接矩阵一定具有对称关系,所以扣除对角线为零外,仅需要存储上三角形或下三角形的数据即可,因此仅需要n/2个空间。
2.2 弗洛伊德算法弗洛伊德算法使用图的邻接矩阵arcs[n+1][n+1]来存储带权有向图。
算法的基本思想是:设置一个n x n的矩阵A(k),其中除对角线的元素都等于0外,其它元素a(k)[i][j]表示顶点i到顶点j的路径长度,K表示运算步骤。
开始时,以任意两个顶点之间的有向边的权值作为路径长度,没有有向边时,路径长度为∞,当K=0时, A (0)[i][j]=arcs[i][j],以后逐步尝试在原路径中加入其它顶点作为中间顶点,如果增加中间顶点后,得到的路径比原来的路径长度减少了,则以此新路径代替原路径,修改矩阵元素。
具体做法为:第一步,让所有边上加入中间顶点1,取A[i][j]与A[i][1]+A[1][j]中较小的值作A[i][j]的值,完成后得到A(1);第二步,让所有边上加入中间顶点2,取A[i][j]与A[i][2]+A[2][j]中较小的值,完成后得到A(2)…,如此进行下去,当第n步完成后,得到A(n),A(n)即为我们所求结果,A(n)[i][j]表示顶点i到顶点j的最短距离。
因此弗洛伊德算法可以描述为:A(0)[i][j]=arcs[i][j]; //arcs为图的邻接矩阵A(k)[i][j]=min{A(k-1) [i][j],A(k-1) [i][k]+A(k-1) [k][j]},其中k=1,2,…,n(1)定义一个n阶方阵序列:D(-1),D(0),…,D(n-1).D(-1) [i][j] = G.arcs[i][j];D(k) [i][j] = min { D(k-1)[i][j],D(k-1)[i][k] + D(k-1)[k][j] },k = 0,1,…,n-1(2)其中D(0) [i][j]是从顶点vi 到vj中间顶点是v0的最短路径的长度;D(k) [i][j]是从顶点vi 到vj中间顶点的序号不大于k的最短路径长度;D(n-1)[i][j]是从顶点vi 到vj 的最短路径长度。
3类设计3.1 类的概述类代表了某一批对象的共性和特征。
类是对象的抽象。
类这种数据类型中的数据既包含数据也包含操作数据的函数。
声明类的一般形式:class 类名{ private:私有的数据和成员函数;public:公用的数据和成员函数;};定义对象:类名对象名;可以在类外定义成员函数,在函数名前加上类名,“::”是作用域限定符或称作用域运算符用它说明函数式属于哪个类的。
如下面程序中的void MGraph::CreateMGraph(MGraph &G){函数体}3.2 类的接口设计#include<iostream>#include <string>#include <stdio.h>using namespace std;#define MaxVertexNum 100#define INF 32767class MGraph{private:char vertex[MaxVertexNum]; //顶点信息int edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵int n,e; //顶点数和边数public:void CreateMGraph(MGraph &); //构造有向图void Ppath(int[][100],int,int);void Dispath(int[][100],int[][100],int); //输出最短路径void Floyd(MGraph G); //Floyd算法的具体实现};首先将所需文件名写好,定义类MGraph。
在进行类体构造时将数据char vertex[MaxVertexNum]、int edges[MaxVertexNum][MaxVertexNum]和int n,e定义为私有数据,将成员函数void CreateMGraph(MGraph &)、void Ppath(int[][100],int,int)、void Dispath(int[][100],int[][100],int)和void Floyd(MGraph G)定义为公用的,以便非类体的数据调用函数。
3.3 类的实现void MGraph::CreateMGraph(MGraph &G)//构造有向图{int i,j,k,p;cout<<"请输入顶点数和边数:";cin>>G.n>>G.e;cout<<"请输入顶点元素:";for (i=0;i<G.n;i++){cin>>G.vertex[i];}for (i=0;i<G.n;i++){for (j=0;j<G.n;j++){G.edges[i][j]=INF;if (i==j){G.edges[i][j]=0;}}}for (k=0;k<G.e;k++){cout<<"请输入第"<<k+1<<"条弧头弧尾序号和相应的权值:";cin>>i>>j>>p;G.edges[i][j]=p;}}void MGraph::Ppath(int path[][MaxVertexNum],int i,int j) //Ppath()函数在path中递归输出从顶点vi到vj的最短路径。
{int k;k=path[i][j];if (k==-1) // path[i][j]=i时,顶点vi和vj之间无中间顶点,也就是说找到了始节点{return;}Ppath(path,i,k);printf("%d",k);Ppath(path,k,j);}void MGraph::Dispath(int A[][MaxVertexNum],int path[][MaxVertexNum],int n)//输出最短路径的算法{int i,j;for (i=0;i<n;i++){for (j=0;j<n;j++){if (A[i][j]==INF){if (i!=j){printf("从%d到%d没有路径\n",i,j);}}else{printf(" 从%d到%d=>路径长度:%d路径:",i,j,A[i][j]);printf("%d,",i);Ppath(path,i,j);printf("%d\n",j);}}}}void MGraph::Floyd(MGraph G){intA[MaxVertexNum][MaxVertexNum],path[MaxVertexNum][MaxVertexNum];int i,j,k;for (i=0;i<G.n;i++){for (j=0;j<G.n;j++){A[i][j]=G.edges[i][j];path[i][j]=-1;}}for (k=0;k<G.n;k++) // /向vi与vj之间中n次加入中间顶点{for (i=0;i<G.n;i++){for (j=0;j<G.n;j++){if (A[i][j]>A[i][k]+A[k][j]){A[i][j]=A[i][k]+A[k][j];path[i][j]=k;// 表示从i节点到j节点,要经过k节点}}}}Dispath(A,path,G.n);}4基于控制台的应用程序4.1 主函数设计int main(){MGraph G;G.CreateMGraph(G);G.Floyd(G);return 0;}在程序的主函数部分,定义一个MGrapha类的对象G,调用成员函数CreateMGraph()和Floyd()分别完成了采用图的邻接矩阵实现最短路径问题中图的存储和采用Floyd算法求每一对顶点的最短路径的任务。