`
Touch_2011
  • 浏览: 290482 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

求最短路径的两种算法(C语言实现)

阅读更多

 

求这个有向网中任意两点的最短路径

 

/*
 * 最短路径,迪杰斯特拉算法和弗洛伊德算法(采用邻接矩阵存储)
 *
 */

#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
2
0
分享到:
评论

相关推荐

    c语言算法与数据结构最短路径报告+代码.zip

    6. **课程报告**:这份报告很可能会包括算法的理论介绍、伪代码、C语言实现代码以及实验结果分析。对于初学者来说,这是一份很好的学习资料,它可以帮助理解算法的工作原理,同时提供实际操作的机会,加深对知识的...

    数学建模最短路径c语言版

    本话题聚焦于“最短路径”算法的C语言实现,这是一个在运筹学、图论和计算机科学中广泛应用的概念。最短路径问题通常出现在网络路由、交通规划、资源分配等场景,寻找两点间成本最低或时间最短的路径。 C语言是一种...

    求最短路径的最新算法

    内容:本文提出了一种求最短路径的新算法,并用C语言设计相应的程序验证了此算法。实验表明,该算法能高效地求出一个顶点到其它各顶点的所有最短路径。最短路径问题是图论中研究的一个重要课题,广泛应用于交通、...

    floyd最短路径算法

    总结来说,Floyd算法是一种高效、灵活的求解多源最短路径问题的方法,通过动态规划逐步完善最短路径信息,具有广泛的实用价值。理解和掌握这一算法,对于从事图论、数据结构、网络优化等领域的工作有着重要意义。

    C语言最短路径算法实现

    在计算机科学领域,最短路径算法是用于寻找网络或图中两点之间最短路径的算法。C语言作为基础且强大的编程语言,常被用来实现这些算法。本篇将重点介绍如何使用C语言来实现最短路径算法,并探讨几种常见的算法。 1....

    最短哈密顿回路算法C语言实现

    总结来说,C语言实现最短哈密顿回路算法涉及到图的表示、搜索算法(如DFS或BFS)、最短路径的判断以及状态跟踪。在实际编程时,还需要考虑如何有效地存储和操作图数据,以及如何避免死循环和重复路径。理解和分析...

    C语言-景区简易导航系统(求最短路径)

    在本项目中,我们探讨的是一个基于C语言实现的简易景区导航系统,它利用了最短路径算法——弗洛伊德算法(Floyd-Warshall Algorithm),为用户提供从起点到终点的最短路径规划。下面将详细介绍这个系统的核心概念、...

    Dijkstra算法求最短路径的C/C++程序一

    Dijkstra算法是一种用于查找图中两点间最短路径的算法。它适用于有向图和无向图,但要求图中的所有边权重均为非负值。该算法通过逐步扩展一个顶点集合S,使得S内的所有顶点到起始顶点的距离均已被确定。 #### 程序...

    最短路径_C语言算法.doc

    最短路径_C语言算法 ...本资源提供了一个完整的最短路径算法的C语言实现,涵盖了图形问题、最短路径算法、C语言实现、数组和结构体、循环和条件语句、图形的表示、算法优化和代码实现等多个知识点。

    寻找最短路径A*算法的实现

    A*算法是一种启发式搜索算法,它在Dijkstra算法的基础上增加了对目标的预估,从而能更快地找到最短路径。 A*算法的核心在于评估函数f(n) = g(n) + h(n),其中g(n)是从初始节点到当前节点的实际代价,h(n)是从当前...

    任意两个顶点之间的最短路径_Floyd算法_C语言

    综上所述,Floyd算法是一种经典的图论算法,通过动态规划求解所有顶点对之间的最短路径。在C语言中,我们可以用二维数组轻松实现该算法,解决实际问题。然而,由于其时间复杂度较高,当处理大型图时,需考虑其他更...

    最短路径实现算法

    最短路径算法是图论中的一个经典问题,用于寻找图中两个节点间的最短路径。在计算机科学中,这个问题有着广泛的应用,例如网络路由、物流配送、交通规划等。本项目是通过C语言来实现这一算法,使得学习者能够更好地...

    c语言寻找最短路径算法

    在提供的压缩包文件“最短路径”中,可能包含了C语言实现这些算法的源代码,通过阅读和理解代码,可以深入学习如何在实际编程中应用这些算法。对于初学者,这是一次很好的实践机会,不仅能提升C语言编程技能,还能...

    C语言实现F算法 最短路径算法

    【F算法】是一种用于求解图中两点间最短路径的算法,主要应用于网络路由、交通规划等领域。在这个C语言实现的程序中,F算法被用来寻找最短的路由花费。程序可以处理最大100个节点的网络,并在VC++6.0环境下运行。 ...

    简单c语言校园导游-最短路径

    最短路径的典型用法,迪杰斯特拉和弗洛伊德两种算法的应用

    最短路径问题Dijkstra

    这个算法适用于寻找有向或无向图中单源最短路径。 Dijkstra算法的基本思想是采用贪心策略,每次选择当前未访问节点中距离源节点最近的一个,将其加入到已访问集合,并更新与该节点相邻的未访问节点的距离。它保证了...

    弗洛伊德(Floyd)算法求任意两点间的最短路径

    弗洛伊德(Floyd)算法,又称为弗洛伊德-沃许豪森算法,是一种用于寻找图中所有顶点对之间的最短路径的经典算法。这个算法的主要思想是逐步考虑中间节点,通过动态规划的方法逐步优化最短路径。下面我们将深入探讨这...

    基于C语言的最短路径算法

    本文将介绍如何使用C语言实现Dijkstra算法,并提供一种高效的数据结构来支持算法的运行。 #### 2. 数据结构定义 为了高效地查找最短路径,设计了一种特定的数据结构——`SPoint`类,用于存储图中的节点信息。每个...

    C语言数据结构用队列求解迷宫最短路径

    从给定的代码片段来看,这是一段使用C语言实现迷宫最短路径求解的程序,主要通过队列(Queue)与栈(Stack)的数据结构来完成算法的设计与实现。下面将对这段代码涉及的关键知识点进行详细解析。 ### C语言中的数据...

Global site tag (gtag.js) - Google Analytics