`
Touch_2011
  • 浏览: 287169 次
  • 性别: 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语言校园导游-最短路径

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

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

    Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。

    数据结构—图及其应用(交通问题,实现最短路径、最短时间、最少费用查询).rar

    数据结构—图及其应用(交通问题,实现最短路径、最短时间、最少费用查询),并且实现了简单的打印图。设计一个城市交通咨询模拟系统,利用该系统实现至少两种最优决策:最短路程到达、最省时到达等线路规划。

    C语言实现最短路径规划

    分别在有无时间约束两种条件下的两种最优运输成本问题

    数据结构 图的最短路径

    数据结构,图的最短路径的算法,用C语言编写程序代码///////

    图的遍历邻接表存储

    出于不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能短,...2.编程实现求图最短路径的两种算法; *3.(选做题,如果选择了此题就不用做上面的2)综合训练:全国交通咨询模拟。

    c语言数据结构算法演示(Windows版)

    (6)求最短路径  弗洛伊德算法(shortpath_Floyd)  迪杰斯特拉算法(shortpath_DIJ) 9. 存储管理 (1)边界标识法 (Boundary_tag_method) (2)伙伴系统 (Buddy_system) (3)紧缩无用单元 (Storage_...

    c语言模拟磁盘调度

    windows VS2005 环境下使用c语言模拟CPU磁盘调度程序,使用最短路径和看电梯两种调度方法,支持多线程的用户发送请求。

    管道铺设施工最佳方案

    基于C++编写的求最短路径的程序,属于贪心算法程序设计思想。里面有两种经典的最短路径求解方法。

    数据结构(C语言版)[严蔚敏]

    光盘内容可在DOS环境下运行的以类C语言描述的“数据结构算法动态模拟辅助教学软件,以及在Windows环境下运行的以类PASCAL或类C两种语言描述的“数据结构算法动态模拟辅助教学软件”。 目录: 第1章 绪论 1.1 什么...

    严蔚敏:数据结构题集(C语言版)

    本书后附有光盘,光盘中含有可在DOS环境下运行的以类C语言描述的“数据结构算法动态模拟辅助教学软件,以及在Windows环境下运行的以类PASCAL或类C两种语言描述的“数据结构算法动态模拟辅助教学软件”。本书可作为...

    《数据结构》(C语言版)严蔚敏

    光盘内容可在DOS环境下运行的以类C语言描述的“数据结构算法动态模拟辅助教学软件,以及在Windows环境下运行的以类PASCAL或类C两种语言描述的“数据结构算法动态模拟辅助教学软件”。内附 数据结构算法实现(严蔚敏...

    算法导论(part1)

    书中每一章都给出了一个算法、一种算法设计技术、一个应用领域或一个相关的主题。算法是用英语和一种“伪代码”来描述的,任何有一点程序设计经验的人都能看得懂。书中给出了230多幅图,说明各个算法的工作过程。...

    [数据结构(C语言版)].严蔚敏_吴伟民.高清扫描版.rar

    光盘内容可在DOS环境下运行的以类C语言描述的“数据结构算法动态模拟辅助教学软件,以及在Windows环境下运行的以类PASCAL或类C两种语言描述的“数据结构算法动态模拟辅助教学软件”。 本书可作为计算机类专业或信息...

    数据结构的上机作业答案

    2)用两种算法实现1-1/x+1/x*x-1/x*x*x+1/x*x*x*x…., 注(algo1-1,algo1-2) 实验2:线性表 1) 顺序表的合并:实现书中P26中算法2.7,La=1 2 3 4 5, Lb=2 4 6 8 10。要求得到合并后的Lc=1 2 3 4 5 6 8 10 注...

    C语言的幻灯片教学和word文档

    §1.1 C语言发展的历史 计算机语言的种类很多,大致可分为如下几种: 1. 机器语言 ...根据逻辑结构写出存储方式(不外乎两种:一是数组,二是链表) 根据存储方式写出算法 最后根据算法写出程序。

    算法模板.zip

    Dinic算法,可以看作是两种方法的结合体,它进行了一定的优化,对于某些横边多的图,运行速度方面得到了大幅提升 Dinic算法的基本思路: 根据残量网络计算层次图。 在层次图中使用DFS进行增广直到不存在增广路 ...

    C语言通用范例开发金典.part2.rar

    范例1-111 每一对顶点之间的最短路径 387 ∷相关函数:ShortestPath_FLOYD函数 1.8 本章小结 395 第2章 数值计算 397 2.1 常见的数学函数 398 2.1.1 求整数的绝对值 398 范例2-1 求整数的绝对值 398 ∷相关...

    C语言通用范例开发金典.part1.rar

    范例1-111 每一对顶点之间的最短路径 387 ∷相关函数:ShortestPath_FLOYD函数 1.8 本章小结 395 第2章 数值计算 397 2.1 常见的数学函数 398 2.1.1 求整数的绝对值 398 范例2-1 求整数的绝对值 398 ∷相关...

Global site tag (gtag.js) - Google Analytics