其中包括测试程序,可直接编译运行
在Windows XP professional , Dev-cpp V4.9.9.0中编译通过
参考了计算机网络(第三版)
/************************************
**名称:Dijkstra路由算法示例
**程序编写:finytang
**日期:2005.4.10
**版本:1.0
*************************************/
#include <stdio.h>
#include <stdlib.h>
#define INFINITY 10000000 /*不可达*/
#define MAX_NODES 8 /*最大节点数*/
struct state /*节点结构变量*/
{
int predecessor;
int length;
enum {
permanent = 0,
tentative } label;
}state[MAX_NODES];
int n = MAX_NODES;
/*节点构成图,0表示不相邻*/
int dist[MAX_NODES][MAX_NODES] = {
{0,2,0,0,0,0,0,0},
{2,0,7,0,2,0,0,0},
{0,7,0,3,0,3,0,0},
{0,0,3,0,0,0,0,8},
{0,2,0,0,0,2,1,0},
{0,0,3,0,2,0,0,2},
{6,0,0,0,1,0,0,8},
{0,0,0,2,0,2,4,0}};
void Dijkstra_RA( int s, int t, int path[] ); /*核心算法函数,s开始节点,t结束结点,path最短路径*/
void OutputRoutData(); /*输出函数*/
int main(int argc, char *argv[])
{
int path[MAX_NODES];
int i;
int s,t;
for( i = 0; i < MAX_NODES; i++ )
{
path[i] = -1;
}
OutputRoutData();
printf( "Enter the start node(0-%d):",MAX_NODES-1);
scanf("%d",&s);
printf( "Enter the end node(0-%d):",MAX_NODES-1);
scanf("%d",&t);
if( s < 0 || s > MAX_NODES-1 || t < 0 || t > MAX_NODES-1 || s==t )
{
printf("The shoortest path is not available/n");
system("PAUSE");
return 0;
}
Dijkstra_RA( s , t, path );
printf( "The shortest path is " );
for( i = 0; i < MAX_NODES; i++ )
{
if(path[i]>=0)
{
printf( "%d ",path[i] );
}
}
printf( "/n" );
system("PAUSE");
return 0;
}
void Dijkstra_RA( int s, int t, int path[] )
{
int i, k, min;
struct state *p;
for( p = state; p < state+n; p++ )
{
p->predecessor = -1;
p->length = INFINITY;
p->label = tentative;
}
state[t].length = 0;
state[t].label = permanent;
k = t;
do
{
for( i = 0; i < n; i++ )
{
if( dist[k][i] != 0 && state[i].label == tentative )
{
if( state[k].length+dist[k][i] < state[i].length )
{
state[i].predecessor = k;
state[i].length = state[k].length+dist[k][i];
}
}
}
k = 0;
min = INFINITY;
for( i = 0; i < n; i++ )
{
if( state[i].label == tentative && state[i].length < min )
{
min = state[i].length;
k = i;
}
}
state[k].label = permanent;
}
while( k != s );
i = 0;
k = s;
do
{
path[i++] = k;
k = state[k].predecessor;
}
while( k >= 0 );
}
void OutputRoutData()
{
int i,j;
printf(" ");
for(i=0; i<MAX_NODES; i++)
{
printf("< %d > ", i);
}
printf("/n");
for (i=0; i<MAX_NODES; i++)
{
printf("%d ", i);
for (j=0; j<MAX_NODES; j++)
{
if (dist[i][j] == 0)
printf(" - ");
else
printf(" %d ", dist[i][j]);
}
printf("/n");
}
printf("/n");
}