5 楼
liangbch [专家分:1270] 发布于 2006-06-22 11:53:00
下面给出我 写的一个 求最短路径 的一个完整的程序。
程序说明:
2维数组costarray定义了12个点中,任意两个点的距离,max表示这两个点是不相连的。MinCost是一个计算最短路径的函数,采用递归调用算法.第三个参数level表示递归调用到第几层,首次调用level=0,在函数中再次调用为level=1,这个参数的设置主要是为了记录路径用的,当这个函数计算完毕,一条从起点到终点的路径就存储到数组 minway 中,可以用printPath打印出路径.
#include <stdio.h>
#include <time.h>
#define max 100
#define START_NODE 0
#define END_NODE 11
int costarray[12][12]=
{
// 0 1 2 3 4 5 6 7 8 9 10 11
{max, 9, 7, 3, 2, max,max,max,max,max,max,max}, //0
{max, max,max,max,max,4, 2, 1, max,max,max,max}, //1
{max, max,max,max,max,2, 7, max,max,max,max,max}, //2
{max, max,max,max,max,max,max,11, max,max,max,max}, //3
{max, max,max,max,max,max,11, 8, max,max,max,max}, //4
{max, max,max,max,max,max,max,max,6, 5, max,max}, //5
{max, max,max,max,max,max,max,max,4, 3, max,max}, //6
{max, max,max,max,max,max,max,max,max,5, 6, max}, //7
{max, max,max,max,max,max,max,max,max,max,max,4}, //8
{max, max,max,max,max,max,max,max,max,max,max,2}, //9
{max, max,max,max,max,max,max,max,max,max,max,5}, //10
{max, max,max,max,max,max,max,max,max,max,max,max} //11
};
int minway[12];
int cost=100*max;
void printPath()
{
int i;
for (i=0;true;i++)
{
printf( "%d",minway[i]);
if (minway[i]==END_NODE)
break;
else
printf("->");
}
printf("\n");
}
int MinCost(int i,int j,int level)
{
int min=10000*max;
int k,t;
minway[level]=i;
if (costarray[i][j]!=max)
{
min=costarray[i][j];
if (j==END_NODE)
minway[level+1]=j;
}
for(k=START_NODE;k<END_NODE;k++)
{
if (k==i || k==j || costarray[i][k] ==max)
continue;
t=costarray[i][k]+MinCost(k,j,level+1);
if (t<min)
{
min=t;
if (i==START_NODE)
printPath();
}
}
return min;
}
void main()
{
int cost=MinCost(START_NODE,END_NODE,0);
printf("min cost=%d\n",cost);
}