Dijkstra 实现最短路径

 

使用Dijkstra算法求网络图中的最短路径是一种很常见的数据结构内容。

1、求出最短路径

2、计算最短路径的线路(routine)

 

如下图:


Dijkstra 实现最短路径
 

 

程序代码:

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 实现最短路径