floyd算法的C语言实现
- 格式:doc
- 大小:39.50 KB
- 文档页数:5
最短路径——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算法的基本概念在介绍C语言以及Floyd算法在校园导航中的应用之前,我们先来了解一下校园导航最短距离-Floyd算法的基本概念。
Floyd算法是一种用于寻找加权图中顶点对之间最短路径的算法,主要用于解决多源点之间的最短路径问题。
在校园导航中,可以将校园内不同的地点看作图中的顶点,而顶点之间的路径长度则可以看作边的权重,Floyd算法就可以帮助我们快速找到任意两个地点之间的最短路径。
而C语言作为一种结构化程序设计语言,其高效、灵活的特性可以很好地支持Floyd算法的实现。
三、C语言在校园导航最短距离中的应用1. 基于邻接矩阵的图表示在C语言中,我们可以利用二维数组来表示图的邻接矩阵,用来存储不同地点之间的路径长度。
通过邻接矩阵的方式,我们可以方便地在程序中存储校园内各个地点之间的距离,为Floyd算法的实现提供了基础。
2. Floyd算法的实现在C语言中,我们可以通过嵌套循环来实现Floyd算法。
我们需要初始化一个二维数组来存储任意两个地点之间的最短距离,然后通过三重循环来不断更新这个数组,直到找到所有顶点对之间的最短路径。
C 语言的结构化特性使得Floyd算法的实现变得简洁清晰,同时也可以充分利用C语言的指针和数组操作来提高算法的效率。
四、校园导航最短距离-Floyd算法的个人观点和理解作为一名计算机科学专业的学生,我对校园导航最短距离-Floyd算法的应用深感兴趣。
我认为Floyd算法的高效性和C语言的灵活性为校园导航提供了新的可能性,可以帮助校园内的师生更快捷、准确地找到目的地。
运筹学最小支撑树算法和FLOYD算法的C语言实现一、最小支撑树算法:#include <stdio.h>#define butong 32767#define N 7typedef struct{int vnum;int arcs[N][N];}graph; //定义图的结构void jtu(graph *p){int i,j,n ;int v1,v2,w;printf("请输入图的顶点个数:");scanf("%d",&n);p->vnum=n;for(i=0;i<n;++i)//初始化for(j=0;j<n;++j)if(i==j)p->arcs[i][j]=0;elsep->arcs[i][j]=butong;printf("请输入边的基本信息(以输入三个-1结束):\n");do{printf("边(顶点1,顶点2,权):");scanf("%d,%d,%d",&v1,&v2,&w);if(v1>=0&&v1<n&&v2>=0&&v2<n){p->arcs[v1][v2]=w;p->arcs[v2][v1]=w;}}while(!(v1==-1&&v2==-1));}int zcs(graph G,int v, int shu[][3])//最小支撑树函数{int i,j,k,p,min,c;int lowcost[N],closest[N];for(i=0;i<G.vnum;++i){closest[i]=v;lowcost[i]=G.arcs[v][i];}c=0;p=0;for(i=0;i<G.vnum-1;++i){min=butong;for(j=0;j<G.vnum;++j)if(lowcost[j]!=0&&lowcost[j]<min){min=lowcost[j];k=j;}shu[p][0]=closest[k];shu[p][1]=k;shu[p][2]=min;p++;c+=min;lowcost[k]=0;for(j=0;j<G.vnum;++j)if(G.arcs[k][j]!=0&&G.arcs[k][j]<lowcost[j]){lowcost[j]=G.arcs[k][j];closest[j]=k;}}return c;}void main(){int i;int shu[N][3];int cost;graph G;jtu(&G);cost=zcs(G,1,shu);printf("最小支撑树:\n");printf("边\t 权\t\n");for(i=0;i<G.vnum-1;++i)printf("v%d-v%d\t%d\n",shu[i][0]+1,shu[i][1]+1,shu[i][2]); }二、FLOYD算法:#include<stdio.h>#include<math.h>#define N 100void main(){int Num;int k,i,j;float arry[N][N];float dist[N][N]={0};printf("请输入顶点个数:\n");scanf("%d",&Num);printf("请输入权值矩阵(10000表示两点不连通):\n");for(i=0;i<Num;i++)for(j=0;j<Num;j++)scanf("%f",&arry[i][j]);printf("\n\n");for(i=0;i<Num;i++)for(j=0;j<Num;j++){printf(" %3.1f",arry[i][j]);if(j==Num-1)printf("\n");}printf("\n\n");for(i=0;i<Num;i++)for(j=0;j<Num;j++){dist[i][j]=arry[i][j]; }for(k=0;k<Num-1;k++)for(i=0;i<Num;i++)for(j=0;j<Num;j++)if(dist[i][k]+dist[k][j]<dist[i][j]){dist[i][j]=dist[i][k]+dist[k][j];}printf("最短路径为:");for(i=0;i<Num;i++)for(putchar('\n'),j=0;j<Num;j++)printf(" %3.1f",dist[i][j]);printf("\n");}。
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语言实现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. 算法测试我们来测试一下上述代码的运行结果。
实验三最短路径的算法(离散数学实验报告)实验3:最短路径算法⼀、实验⽬的通过本实验的学习,理解Floyd(弗洛伊得)最短路径算法的思想⼆、实验内容⽤C语⾔编程实现求赋权图中任意两点间最短路径的Floyd算法,并能对给定的两结点⾃动求出最短路径三、实验原理、⽅法和⼿段1、Floyd算法的原理定义:Dk[i,j] 表⽰赋权图中从结点vi出发仅通过v0,v1,┉,vk-1中的某些结点到达vj的最短路径的长度,若从vi到vj没有仅通过v0,v1,┉,vk-1 的路径,则D[i,j]=∝即D-1[i,j] 表⽰赋权图中从结点vi到vj的边的长度,若没有从结点vi到vj的边,则D[i,j]=∝D0[i,j] 表⽰赋权图中从结点vi到vj的”最短”路径的长度, 这条路上除了可能有v0外没有其它结点D1[i,j] 表⽰赋权图中从结点vi到vj的”最短”路径的长度, 这条路上除了可能有v0,v1外没有其它结点┉┉┉根据此定义,D k[i,j]=min{ D k-1[i,j] , D k-1[i,k-1]+D k-1[k-1,j] }定义:path[i,j]表⽰从结点vi到vj的“最短”路径上vi的后继结点四、实验要求要求输出每对结点之间的最短路径长度以及其最短路径五、实验步骤(⼀)算法描述Step 1 初始化有向图的成本邻矩阵D、路径矩阵path若从结点vi到vj有边,则D[i,j]= vi到vj的边的长度,path[i,j]= i;否则D[i,j]=∝,path[i,j]=-1Step 2 刷新D、path 对k=1,2,┉n 重复Step 3和Step 4Step 3 刷新⾏对i=1,2,┉n 重复Step 4Step 4 刷新Mij 对j=1,2,┉n若D k-1[i,k]+D k-1[k,j][结束循环][结束Step 3循环][结束Step 2循环]Step 5 退出(⼆)程序框图参考主程序框图其中,打印最短路径中间结点调⽤递归函数dist(),其框图如下,其中fist,end是当前有向边的起点和终点dist(int first, int end)七、测试⽤例:1、输⼊成本邻接矩阵:D :06380532290141003210∝∝∝∝V V V V V V V V (其中∝可⽤某个⾜够⼤的数据值代替,⽐如100)可得最短路径矩阵:P :131132122211111010103210--------V V V V V V V V以及各顶点之间的最短路径和最短路径长度:从V0到V1的最短路径长度为:1 ;最短路径为:V0→V1 从V0到V2的最短路径长度为:9 ;最短路径为:V0→V1→V3→V2 从V0到V3的最短路径长度为:3 ;最短路径为:V0→V1→V3 从V1到V0的最短路径长度为:11;最短路径为:V1→V3→V2→V0从V1到V2的最短路径长度为:8 ;最短路径为:V1→V3→V2 从V1到V3的最短路径长度为:2 ;最短路径为:V1→V3 从V2到V0的最短路径长度为:3 ;最短路径为:V2→V0 从V2到V1的最短路径长度为:4 ;最短路径为:V2→V0→V1 从V2到V3的最短路径长度为:6 ;最短路径为:V2→V0→V1→V3 从V3到V0的最短路径长度为:9 ;最短路径为:V3→V2→V0 从V3到V1的最短路径长度为:10;最短路径为:V3→V2→V0→V1 从V3到V2的最短路径长度为:6 ;最短路径为:V3→V2 参考程序: #include #define INFINITY 100 #define Max 10int a[Max][Max],P[Max][Max]; main() {void Print_Flod(int d);int i,j,k,D=4;printf("请输⼊成本邻接矩阵:\n");for(i=0;ifor(j=0;j{scanf("%d",&a[i][j]);}for(i=0;ifor(j=0;j{if(a[i][j]>0&& a[i][j]elseP[i][j]=-1;}for(k=0;kfor(i=0;ifor(j=0;jif (a[i][k]+a[k][j]{a[i][j]=a[i][k]+a[k][j];P[i][j]=k;}Print_Flod(D);}void Print_Flod(int d){void dist(int first,int end);int i,j;for(i=0;ifor(j=0;jif(i!=j){ printf("from V%d to V%d: ",i,j); dist(i,j);printf("V%d",j);printf(" (The length is: %d)\n",a[i][j]); }}void dist(int first,int end){ int x;x=P[first][end];if(x!=first){ dist(first,x); dist(x,end); }else printf("V%d->",x);}输出结果:。
弗洛伊德算法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++)图的最短路径问题主要包括三种算法:(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]参考资料:。