#include <stdio.h>
#define MAX_NODES 5 /*定义最大节点数*/
#define INFINITY 99999
int n=MAX_NODES;
int dist[MAX_NODES][MAX_NODES] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25} };/*定义二维数组*/
void shortest_path(int s, int t, int path[]) /*定义最短路径的构造方法*/
{
struct state
{
int predecessor;/*定义上一个节点*/
int length;/*定义路径长度*/
enum{permanent, tentative} label;/*定义“永久”标记或“暂时”标记*/
} state[MAX_NODES];
int i/*定义要经过的当前节点*/, k/*定义要经过的下一个节点*/, min=5/*定义路径最小值,即将计算出来的最短路径与此值比较,若小于此值,则为最短路径*/;
struct state *p;/*定义状态指针,即数据传输到第几个节点*/
for(p=&state[0]; p<&state[n]; p++)
{
p->predecessor = -1;
p->length = INFINITY;
p->label = tentative;
}
state[t].length = 0;/*定义当前路径长度为0*/
state[t].label = permanent;
k = t;/*将数据存储起来*/
do/*计算最短路径*/
{
for(i=0; i<n; i++)
if(dist[k][i] !=0 && state[i].label == tentative)/*dist[k][i]为两节点之间的距离*/
{
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; i<n; i++)
if(state[k].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);
}
int main()
{
int i;
int path[MAX_NODES];
shortest_path(0, 1, path);
for( i = 0; i < MAX_NODES; i++ )
{
printf("path[%d] = %d\n", i, path[i] );/*打印最短路径的长度*/
}
return 0;
}