使用Dijkstra算法求网络图中的最短路径是一种很常见的数据结构内容。
1、求出最短路径
2、计算最短路径的线路(routine)
如下图:

程序代码:
graph.c
/*
* graph.c
*
* Created on: 2011年8月29日
* Author: ww
*/
#include "graph.h"
#include <stdio.h>
#define N 6
#define MAX 1000000
int graph[N][N] =
{
{ MAX, MAX, 10, MAX, 30, 100 },
{ MAX, MAX, 5, MAX, MAX, MAX },
{ MAX, MAX, MAX, 50, MAX, MAX },
{ MAX, MAX, MAX, MAX, MAX, 10 },
{ MAX, MAX, MAX, 20, MAX, 60 },
{ MAX, MAX, MAX, MAX, MAX, MAX } };
int routine[N][N] =
{
{ 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0 },
{ 0, 2, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0 },
{ 0, 4, 0, 0, 0, 0 },
{ 0, 5, 0, 0, 0, 0 } };
void Dijkstra()
{
int d[N] =
{ MAX, MAX, 10, MAX, 30, 100 };
int isMins[N] =
{ 0 };
int i, j = 0, min, v;
for (i = 1; i < N; i++)
{
min = MAX;
for (j = 0; j < N; j++)
{
if (isMins[j] != 1 && d[j] < min)
{
min = d[j];
v = j;
}
}
isMins[v] = 1;
for (j = 0; j < N; j++)
{
if (isMins[j] != 1 && min + graph[v][j] < d[j])
{
d[j] = min + graph[v][j];
if (routine[j][0] == 1)
{
routine[j][0] = 1;
routine[j][1] = v;
routine[j][2] = j;
}
else
{
int x = 1;
while (routine[v][x])
{
routine[j][x] = routine[v][x];
x++;
}
routine[j][x] = j;
}
}
}
}
for (i = 0; i < N; i++)
{
printf("0-->%d 距离为 %d \n", i, d[i]);
}
for (i = 1; i < N; i++)
{
printf("到%d的路线为:", i);
for (j = 1; j < N; j++)
{
printf("%5d", routine[i][j]);
}
printf("\n");
}
}
graph.h
/* * graph.h * * Created on: 2011年8月29日 * Author: ww */ #ifndef GRAPH_H_ #define GRAPH_H_ void Dijkstra(); #endif /* GRAPH_H_ */
main.c
/*
* main.c
*
* Created on: 2011年8月21日
* Author: ww
*/
#include <stdio.h>
#include <stdlib.h>
#include "graph.h"
int main(int argc, char **argv)
{
Dijkstra();
return 1;
}
运行结果:

本文详细介绍了使用Dijkstra算法求解网络图中两点间最短路径的方法,包括程序实现和运行结果解析。
86万+

被折叠的 条评论
为什么被折叠?



