最短路径

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径相关的知识,希望对你有一定的参考价值。

用邻接矩阵建有向图 求各顶点间最短路径 必须可以实现 最好自己编的 好的话再奖励100分
在线等! 用C给编写啊 要完整代码啊 最好用弗洛伊德算法 允许输入数据建图 回答的太晚了 不过还是谢谢哈!再过些天给分吧!

弗洛伊德算法求各顶点间最短路径

符合要求用的是邻接矩阵和C语言

#include <stdio.h>

#define VERTEX_NUM 3
#define INFINITY 10000
#define TRUE 1
#define FALSE 0

typedef struct Graph

char vexs[VERTEX_NUM]; /*顶点*/
int arcs[VERTEX_NUM][VERTEX_NUM]; /*邻接矩阵*/
int vexnum; /*顶点数*/
int arcnum; /*弧数*/
Graph;

void ShortestPath(Graph g,int p[VERTEX_NUM][VERTEX_NUM][VERTEX_NUM],int d[VERTEX_NUM][VERTEX_NUM])

/*弗洛伊德算法求每一对顶点之间的最短路径*/
int v;
int w;
int u;
int i;

for (v = 0; v < g.vexnum; v++)
for (w = 0; w < g.vexnum; w++)

d[v][w] = g.arcs[v][w];
for (u = 0; u < g.vexnum; u++)
p[v][w][u] = -1;
if (d[v][w] < INFINITY) /*从v到w有直接路径*/

p[v][w][v] = w;


for (u = 0; u < g.vexnum; u++)
for (v = 0; v < g.vexnum; v++)
for (w = 0; w < g.vexnum; w++)
if (d[v][u] + d[u][w] < d[v][w]) /*从v经u到w的一条路径更短*/

d[v][w] = d[v][u] + d[u][w];
for (i = 0; i < g.vexnum; i++)

if (p[v][u][i] != -1)
p[v][w][i] = p[v][u][i];
else
p[v][w][i] = p[u][w][i];




void PrintPath ( Graph g, int p[VERTEX_NUM][VERTEX_NUM][VERTEX_NUM],int d[VERTEX_NUM][VERTEX_NUM] )

/*输出最短路径*/
int i,j,k;

for (i = 0; i < g.vexnum; i++)

for (j = 0; j < g.vexnum; j++)

printf("Path %c to %c:\n",g.vexs[i],g.vexs[j]);
if ( p[i][j][i] == i ) /*顶点到自身*/
printf("%c\n",g.vexs[i]);
else if ( p[i][j][i] == -1 ) /*没有路径*/
printf("No path!\n");
else /*存在路径则输出*/

for (k = i; k != -1; k = p[i][j][k])

if (k != i)
printf("→");
printf("%c",g.vexs[k]);

printf("\n");

printf("Length:%d\n",d[i][j]);
printf("\n");




void main()

int i,
j;
Graph g;
int p[VERTEX_NUM][VERTEX_NUM][VERTEX_NUM];
int d[VERTEX_NUM][VERTEX_NUM];

/*初始化图g*/
g.vexs[0]='A',g.vexs[1]='B',g.vexs[2]='C';
for(i=0;i<VERTEX_NUM;i++)
for(j=0;j<VERTEX_NUM;j++)

if (i == j)
g.arcs[i][j]=0;
else
g.arcs[i][j]=INFINITY;

g.arcs[0][1]=4,g.arcs[0][2]=11,g.arcs[1][0]=6,g.arcs[1][2]=2,
g.arcs[2][0]=3;
g.vexnum=VERTEX_NUM;
g.arcnum=5;

/*输出图的有关信息*/
for(i=0;i<VERTEX_NUM;i++)

printf("%c\t",g.vexs[i]);
for(j=0;j<VERTEX_NUM;j++)

printf("%5d ",g.arcs[i][j]);

printf("\n");


ShortestPath(g,p,d);

PrintPath(g,p,d);
参考技术A 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括:
确定起点的最短路径问题 - 即已知起始结点,求最短路径的问题。
确定终点的最短路径问题 - 与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。
确定起点终点的最短路径问题 - 即已知起点和终点,求两结点之间的最短路径。
全局最短路径问题 - 求图中所有的最短路径。
用于解决最短路径问题的算法被称做“最短路径算法”, 有时被简称作“路径算法”。 最常用的路径算法有:
Dijkstra算法
A*算法
SPFA算法
Bellman-Ford算法
Floyd-Warshall算法
Johnson算法
所谓单源最短路径问题是指:已知图G=(V,E),我们希望找出从某给定的源结点S∈V到V中的每个结点的最短路径。
首先,我们可以发现有这样一个事实:如果P是G中从vs到vj的最短路,vi是P中的一个点,那么,从vs沿P到vi的路是从vs到vi的最短路。

以上是关于最短路径的主要内容,如果未能解决你的问题,请参考以下文章

数据结构8——最短路径

数据结构图之三(最短路径--迪杰斯特拉算法——转载自i=i++

软考 系统架构设计师数学与经济管理① 图论应用

软考 系统架构设计师数学与经济管理① 图论应用

算法导论——单元最短路径

最短路径 Dijkstra 算法为啥边上的权值非负阿?