最短路径:Dijkstra算法和Floyd算法

最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。算法具体的形式包括:

1.确定起点的最短路径问题:即已知起始结点,求最短路径的问题。适合使用Dijkstra算法。

2.确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。

3.确定起点终点的最短路径问题:即已知起点和终点,求两结点之间的最短路径。

4.全局最短路径问题:求图中所有的最短路径。适合使用Floyd算法。

这里只给出第1种和第四种情况下两种算法的源代码。

#include "stdio.h"
#define MAX 99

typedef struct                    //图的邻接矩阵存储结构体定义
{
	int vexs[6];
	int arcs[6][6];
	int n, e;
}MGraph;

void create(MGraph &G);                 //图的创建
void Dijkstra(MGraph G, int u);         //Dijkstra算法
void Floyd(MGraph G);                   //Floyd算法

int main()
{
	MGraph G;
	create(G);
	printf("最短路径之Dijkstra算法:\n");
	Dijkstra(G, 0);
	printf("最短路径之Floyd算法:\n");
	Floyd(G);

	return 0;
}

void create(MGraph &G)
{
	int i, j;
	printf("请输入顶点数和边数:\n");
	scanf("%d %d", &G.n, &G.e);

	int b[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
	for(i = 0; i < G.n; ++i)
		G.vexs[i] = b[i];
	printf("顶点编号分别为:\n");
	for(i = 0; i < G.n; ++i)
		printf("%d ", G.vexs[i]);

	int a[6][6]={
		{0, 3, MAX, MAX, MAX, MAX},
		{MAX, 0, 2, MAX, 6, 7},
		{MAX, MAX, 0, 1, 3, 4},
		{MAX, MAX, MAX, 0, 1, MAX},
		{MAX, MAX, MAX, MAX, 0, 1},
		{MAX, MAX, MAX, MAX, MAX, 0}
	};
	for(i = 0; i < 6; ++i)
		for(j = 0; j < 6; ++j)
		      G.arcs[i][j]=a[i][j];
	printf("\n该图的邻接矩阵:\n");
	for(i = 0; i < G.n; ++i)
	{
		for(j = 0; j < G.n; ++j)
			printf("%d ", G.arcs[i][j]);
		printf("\n");
	}
}
//Dijkstra算法
void Dijkstra(MGraph G, int u)        //假设此处从顶点0开始
{
	int i, j, k, min;
	int pre[10], final[10], dist[10];
	for(j = 0; j < G.n; ++j)
	{
		dist[j] = G.arcs[u][j];
		if(G.arcs[u][j] == MAX)
			pre[j] = -1;
		else
			pre[j] = u;
		final[j] = 0;
	}
	for(i = 1; i < G.n; ++i)
	{
		min = MAX;
		for(j = 1; j < G.n; ++j)   	//找出最小值的结点
			if( (!final[j]) && (min > dist[j]))
			{
				min = dist[j];
				k = j;
			}
		if(min == MAX)    //找不到
			break;
		final[k] = 1;   //加入该结点
		for(j = 1; j < G.n; ++j)  //更新最短路径
		{
			if((!final[j]) && (dist[j] > (dist[k] + G.arcs[k][j])))
			{
				dist[j] = dist[k] + G.arcs[k][j];
				pre[j] = k;
			}
		}
	}
	for(i = 1; i < G.n; ++i)       //输出路径与距离
	{
		if(pre[i] == -1)
		{
			printf("顶点%d到源点%d不可达。\n", i, u);
			continue;
		}
		printf("(%d, %d) = %d\n", i, u, dist[i]);
     	printf("路径为:");
	    j = i;
		while(j)
		{
			printf("%d→", j);
			j = pre[j];
		}
		printf("0\n");
	}
}
//Floyd算法
void Floyd(MGraph G)
{
	int i, j, k, dist[10][10], pre[10];
	for(i = 0; i < G.n; ++i)
		for(j = 0; j < G.n; ++j)
		{
			dist[i][j] = G.arcs[i][j];
			if(dist[i][j] != MAX)
				pre[j] = i;
			else
				pre[j] = -1;
		}

	for(k = 0; k < G.n; ++k)
		for(i = 0; i < G.n; ++i)
			for(j = 0; j < G.n; ++j)
				if((i != j) && (dist[i][j] > dist[i][k] + dist[k][j]))
				{
					dist[i][j] = dist[i][k] + dist[k][j];
					if(dist[i][j] != MAX)
					{
						pre[j] = k;
						pre[k] = i;
					}
					else
						pre[j] = -1;
				}
	for(i = 0; i < G.n; ++i)
		for(j = 0; j < G.n; ++j)
		{
			if(dist[i][j] == MAX)
				continue;
			else if(i != j)
				printf("(%d, %d) = %d\n", i, j, dist[i][j]);
		}
	printf("其余顶点之间不可达!\n");
}

示例:(读者可自行验证)

时间: 2024-10-17 18:31:23

最短路径:Dijkstra算法和Floyd算法的相关文章

最短路径Dijkstra算法和Floyd算法整理、

转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径—Dijkstra算法和Floyd算法 Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹

最短路径—Dijkstra算法和Floyd算法

Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径) 2.算法

最短路径-Dijkstra算法和Floyd算法

Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径) 2.算法

最短路径—Dijkstra 算法和Floyd 算法

某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input本题目包含多组数据,请处理到文件结束. 每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目.城镇分别以0-N-1编号. 接下来是M行道路信息.每

Dijkstra算法和Floyd算法的正确性证明

说明: 本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节 本人算法菜鸟一枚,提供的证明仅是自己的思路,不保证正确,仅供参考,若有错误,欢迎拍砖指正 ------------------------------------------- Dijkstra算法和Floyd算法用于求解连通图中任意两个顶点之间的最短路径 Dijksra算法从一个顶点v0出发,每次为一个顶点vi确定到达v0的最小路径 Dijkstra算法用distance[i]记录顶点vi到v0的最短路径,用pat

最短路径—大话Dijkstra算法和Floyd算法

Dijkstra算法 算法描述 1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中.在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度.此外,每个顶点对应一个距离,S中的

Dijkstra算法和Floyd算法

一.简介 迪杰斯特拉(Dijkstra)算法和弗洛伊德(Flyod)算法均是用于求解有向图从一点到另外一个点最短路径. 二.Dijkstra 迪杰斯特拉算法也是图论中的明星算法,主要是其采用的动态规划思想,使其在数据结构.算法.离散数学乃至运筹学中都扮演重要的角色. 原文地址:https://www.cnblogs.com/lbrs/p/11986602.html

Dijkstra算法和Floyed算法

写的比较好的三篇文章 Floyed算法 最短路径-Dijkstra算法和Floyed算法 最短路径之Dijkstra算法和Floyed算法 哈哈,他山之石,可以攻玉 自己有心得,慢慢补充

1447.最短路径(dijstra算法和floyd算法)

题目描述: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? 输入: 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0表示输入结束.接下来M行,每行包括3个整数A,B,C(1<