/********************************************************
--程序描述: 图1-1的最短路径算法
--修改日期: 2009.5.31
--修改人: 吴强
--修改原因: 从前写的程序不够规范
--输入要求: 字母A至J
********************************************************/
#include
#include
#define N 5
#define M 10
#define Max 255
typedef struct
{
char node;
int len;
char last;
}Node;
int tu[N][M]={ {0, 2, Max, Max, Max, 4, Max, Max, 9, Max}, /*压缩10*10的对称矩阵*/
{2, 0, 4, Max, Max, Max, Max, Max, Max, Max},
{Max, 1, 0, 2, Max, 8, Max, Max, Max, Max},
{4, Max, 3, 0, 5, Max, Max, Max, Max, Max},
{Max, 3, 6, Max, 0, 7, 3, 5, Max, Max} };
Node nodeArr[M];
main()
{
char ch;
int i;
int put(int,int);
void sort(char c);
int Seek(char c);
for (i=0; i< M; i++) /*初始化数组*/
{
nodeArr[i].node='A'+i;
nodeArr[i].len=Max;
nodeArr[i].last='#';
}
printf("input Node: ");
ch=getchar(); /*输入起点*/
while ( ch< 'A' || ch > 'J' )
{
printf("error/ninput Node: ");
ch=getchar();
}
sort(ch);
for ( i=0; i< M; i++)
{
printf("%c %d %c /n", nodeArr[i].node, nodeArr[i].len, nodeArr[i].last);
}
}
void sort(char c) /*按到起点距离最短的全部排序*/
{
int i;
int j;
int n;
int h;
int k=0;
Node jh;
for ( i=0; i< M; i++ ) /*起点到起点的距离总是0*/
{
if (c==nodeArr[i].node)
{
/*查找原点附值并交换至nodeArr[0]*/
jh=nodeArr[i];
nodeArr[i]=nodeArr[0];
nodeArr[0]=jh;
nodeArr[0].len=0;
nodeArr[0].last='*';
break;
}
}
while(k< M)
{
n=0;
for (i=0; i< M; i++)
{
n=put(c-'A',i); /*该点到各点的距离*/
if (n!=0 || n!=Max)
{
h=Seek('A'+i);
if (nodeArr[h].len> n+nodeArr[k].len)
{
nodeArr[h].len=n+nodeArr[k].len;
nodeArr[h].last=nodeArr[k].node;
}
}
}
j=k+1;
for ( i=j+1; i< M; i++ ) /*查找数组中最小的*/
{
if (nodeArr[j].len> nodeArr[i].len)
{
j=i;
}
}
if (nodeArr[k].node!=nodeArr[j].node)
{
jh=nodeArr[k+1];
nodeArr[k+1]=nodeArr[j];
nodeArr[j]=jh;
}
k++;
c=nodeArr[k].node;
}
}
int put(int i,int j) /*输入下标,在压缩的矩阵中查找各点间距离*/
{
if ( i< M/2 )
{
if ( j< M/2 && j< i )
{
return tu[i][j];
}
else if ( j< M/2 )
{
return tu[j][i];
}
else
{
return tu[M-j-1][M-i-1];
}
}
else
{
if (j< i)
{
return tu[M-i-1][M-j-1];
}
else
{
return tu[M-j-1][M-i-1];
}
}
}
int Seek(char c) /*在所放各点数据的nodeArr数组中查找指定字母的下标*/
{
int i;
for (i=0; i< M; i++)
{
if ( nodeArr[i].node==c )
{
return i;
}
}
return -1;
}
最短路径
最新推荐文章于 2025-01-20 17:23:52 发布
2682

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



