求这个有向网中任意两点的最短路径
/*
* 最短路径,迪杰斯特拉算法和弗洛伊德算法(采用邻接矩阵存储)
*
*/
#include<stdio.h>
#define MAX_VERTEX_NUM 20
#define INFINITE 10000 //当做无穷大
//图的定义
typedef struct
{
int vertexNum;
char vertex[MAX_VERTEX_NUM];
int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
}Graph,*PGraph;
//辅助数组中的元素定义
typedef struct
{
int distance;
int path[MAX_VERTEX_NUM];
}ArrayNode;
//构造有向网
void createdGraph(PGraph g)
{
int i,j;
g->vertexNum=6;
for(i=0;i<g->vertexNum;i++)
g->vertex[i]='A'+i;
for(i=0;i<g->vertexNum;i++)
for(j=0;j<g->vertexNum;j++)
g->arc[i][j]=0;
g->arc[0][2]=10;
g->arc[0][4]=30;
g->arc[0][5]=100;
g->arc[1][2]=5;
g->arc[2][3]=50;
g->arc[3][5]=10;
g->arc[4][3]=20;
g->arc[4][5]=60;
}
//迪杰斯特拉算法
void Dijkstra(PGraph g,int from,int to)
{
int i,j,index=-1;
int n=1;//记录已经求出的两个点之间的最短距离的个数
ArrayNode shortestPath[MAX_VERTEX_NUM];
int flag[MAX_VERTEX_NUM]={0};//标记,为1表示到这个顶点的最短距离已求出
//1.求from到各个顶点的直接距离,即初始化shortestPath数组
for(i=0;i<g->vertexNum;i++){
if(from==i){
shortestPath[i].distance=0;
shortestPath[i].path[0]=i;
flag[from]=1;
}
else if(g->arc[from][i]>0){
shortestPath[i].path[0]=from;
shortestPath[i].path[1]=i;
shortestPath[i].distance=g->arc[from][i];
}else
shortestPath[i].distance=INFINITE;
}
//2.每次求一个最短路径
while(n<g->vertexNum){
//选择shortestPath中距离最小的,求出from到这个顶点的最短路径
index=-1;
for(i=0;i<g->vertexNum;i++){
if(i==from)
continue;
if(flag[i]==0 && index==-1 && shortestPath[i].distance!=INFINITE)
index=i;
if(flag[i]==0 && index!=-1 && shortestPath[i].distance<shortestPath[index].distance)
index=i;
}
flag[index]=1;
//修改到各个顶点的最短路径
for(i=0;i<g->vertexNum;i++){
if(i==from)
continue;
if(g->arc[index][i]>0 && g->arc[index][i]+shortestPath[index].distance<shortestPath[i].distance){
shortestPath[i].distance=g->arc[index][i]+shortestPath[index].distance;
//修改路径
j=0;
while(1){
shortestPath[i].path[j]=shortestPath[index].path[j];
if(shortestPath[index].path[j]==index)
break;
j++;
}
shortestPath[i].path[j+1]=i;
}
}
n++;
}
//输出from到to的最短路径及长度
if(shortestPath[to].distance==INFINITE){
printf("%c到%c没有路径\n",from+'A',to+'A');
return;
}
printf("%c到%c的最短路径长度是:%d\n",from+'A',to+'A',shortestPath[to].distance);
printf("经过的顶点: ");
i=0;
while(1){
printf("%-3c",shortestPath[to].path[i]+'A');
if(shortestPath[to].path[i]==to)
break;
i++;
}
printf("\n");
}
//弗洛伊德算法
void Floyd(PGraph g,int from,int to)
{
int i,j,k;
int shortestPath[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//存储最短路径的数组
//初始化shortestPath
for(i=0;i<g->vertexNum;i++)
for(j=0;j<g->vertexNum;j++){
if(i==j){
shortestPath[i][j]=0;
continue;
}
if(g->arc[i][j]>0)
shortestPath[i][j]=g->arc[i][j];
else
shortestPath[i][j]=INFINITE;
}
//将各个顶点顺次加入,并修改最短路径
for(k=0;k<g->vertexNum;k++){
//在i,j之间加入k
for(i=0;i<g->vertexNum;i++){
for(j=0;j<g->vertexNum;j++){
if(shortestPath[i][k]+shortestPath[k][j]<shortestPath[i][j])
shortestPath[i][j]=shortestPath[i][k]+shortestPath[k][j];
}
}
}
//输出最短路径
if(shortestPath[from][to]==INFINITE){
printf("%c到%c没有路径\n",from+'A',to+'A');
return;
}
printf("%c到%c的最短路径长度是:%d\n",from+'A',to+'A',shortestPath[from][to]);
printf("\n");
}
void main()
{
Graph graph;
char from,to;
createdGraph(&graph);
printf("请输入起点终点(如AF,中间不要有空格)\n");
scanf("%c%c",&from,&to);
printf("\n迪杰斯特拉算法:\n");
Dijkstra(&graph,from-'A',to-'A');
printf("\n弗洛伊德算法:\n");
Floyd(&graph,from-'A',to-'A');
}
- 大小: 19.1 KB
分享到:
相关推荐
6. **课程报告**:这份报告很可能会包括算法的理论介绍、伪代码、C语言实现代码以及实验结果分析。对于初学者来说,这是一份很好的学习资料,它可以帮助理解算法的工作原理,同时提供实际操作的机会,加深对知识的...
本话题聚焦于“最短路径”算法的C语言实现,这是一个在运筹学、图论和计算机科学中广泛应用的概念。最短路径问题通常出现在网络路由、交通规划、资源分配等场景,寻找两点间成本最低或时间最短的路径。 C语言是一种...
内容:本文提出了一种求最短路径的新算法,并用C语言设计相应的程序验证了此算法。实验表明,该算法能高效地求出一个顶点到其它各顶点的所有最短路径。最短路径问题是图论中研究的一个重要课题,广泛应用于交通、...
总结来说,Floyd算法是一种高效、灵活的求解多源最短路径问题的方法,通过动态规划逐步完善最短路径信息,具有广泛的实用价值。理解和掌握这一算法,对于从事图论、数据结构、网络优化等领域的工作有着重要意义。
在计算机科学领域,最短路径算法是用于寻找网络或图中两点之间最短路径的算法。C语言作为基础且强大的编程语言,常被用来实现这些算法。本篇将重点介绍如何使用C语言来实现最短路径算法,并探讨几种常见的算法。 1....
总结来说,C语言实现最短哈密顿回路算法涉及到图的表示、搜索算法(如DFS或BFS)、最短路径的判断以及状态跟踪。在实际编程时,还需要考虑如何有效地存储和操作图数据,以及如何避免死循环和重复路径。理解和分析...
在本项目中,我们探讨的是一个基于C语言实现的简易景区导航系统,它利用了最短路径算法——弗洛伊德算法(Floyd-Warshall Algorithm),为用户提供从起点到终点的最短路径规划。下面将详细介绍这个系统的核心概念、...
Dijkstra算法是一种用于查找图中两点间最短路径的算法。它适用于有向图和无向图,但要求图中的所有边权重均为非负值。该算法通过逐步扩展一个顶点集合S,使得S内的所有顶点到起始顶点的距离均已被确定。 #### 程序...
最短路径_C语言算法 ...本资源提供了一个完整的最短路径算法的C语言实现,涵盖了图形问题、最短路径算法、C语言实现、数组和结构体、循环和条件语句、图形的表示、算法优化和代码实现等多个知识点。
A*算法是一种启发式搜索算法,它在Dijkstra算法的基础上增加了对目标的预估,从而能更快地找到最短路径。 A*算法的核心在于评估函数f(n) = g(n) + h(n),其中g(n)是从初始节点到当前节点的实际代价,h(n)是从当前...
综上所述,Floyd算法是一种经典的图论算法,通过动态规划求解所有顶点对之间的最短路径。在C语言中,我们可以用二维数组轻松实现该算法,解决实际问题。然而,由于其时间复杂度较高,当处理大型图时,需考虑其他更...
最短路径算法是图论中的一个经典问题,用于寻找图中两个节点间的最短路径。在计算机科学中,这个问题有着广泛的应用,例如网络路由、物流配送、交通规划等。本项目是通过C语言来实现这一算法,使得学习者能够更好地...
在提供的压缩包文件“最短路径”中,可能包含了C语言实现这些算法的源代码,通过阅读和理解代码,可以深入学习如何在实际编程中应用这些算法。对于初学者,这是一次很好的实践机会,不仅能提升C语言编程技能,还能...
【F算法】是一种用于求解图中两点间最短路径的算法,主要应用于网络路由、交通规划等领域。在这个C语言实现的程序中,F算法被用来寻找最短的路由花费。程序可以处理最大100个节点的网络,并在VC++6.0环境下运行。 ...
最短路径的典型用法,迪杰斯特拉和弗洛伊德两种算法的应用
这个算法适用于寻找有向或无向图中单源最短路径。 Dijkstra算法的基本思想是采用贪心策略,每次选择当前未访问节点中距离源节点最近的一个,将其加入到已访问集合,并更新与该节点相邻的未访问节点的距离。它保证了...
弗洛伊德(Floyd)算法,又称为弗洛伊德-沃许豪森算法,是一种用于寻找图中所有顶点对之间的最短路径的经典算法。这个算法的主要思想是逐步考虑中间节点,通过动态规划的方法逐步优化最短路径。下面我们将深入探讨这...
本文将介绍如何使用C语言实现Dijkstra算法,并提供一种高效的数据结构来支持算法的运行。 #### 2. 数据结构定义 为了高效地查找最短路径,设计了一种特定的数据结构——`SPoint`类,用于存储图中的节点信息。每个...
从给定的代码片段来看,这是一段使用C语言实现迷宫最短路径求解的程序,主要通过队列(Queue)与栈(Stack)的数据结构来完成算法的设计与实现。下面将对这段代码涉及的关键知识点进行详细解析。 ### C语言中的数据...