题目:10 个节点 N1,…,N10 构成一个计算机局域网, 它们之间的连接关系及通讯延时如下表所示。
(N1,N2,2),(N1,N3,3),(N1,N4,3),(N2,N4,4), (N2,N5,5),(N3,N4,1),(N3,N7,6),(N3,N6,5), (N4,N5,7),(N4,N6,4),(N4,N7,6),(N5,N8,6), (N7,N8,4),(N6,N8,5),(N6,N9,7),(N8,N10,7), (N9,N10,6)
计算 N1 至 N10 的延时最短的路径,以 及相应的延时值。 节点连接关系如上,如 (N1,N2,2) 表示 N1 与 N2 相连,延时值为 2 秒。
通过手算得到N1到其他点的最短路径如下图所示(下图p值,即最后的tem值)
c语言代码如下,本代码实现的是十个点最短路径,可以稍加修改扩大
#include <stdio.h>
#include <stdlib.h>
#define MIN(i, j) (((i) < (j)) ? (i) : (j)) //比较两个数,取小的值
int miv; //两个全局变量,当做最小指示
int mi;
void fmin(int tem[11],int p[11]){ //找到p为零,tem最小的节点,将p置1
miv=200;
for(int i=1;i<11;i++){
if(p[i]==0&&tem[i]<miv){
miv=tem[i];
mi=i;
p[mi]=1;
}
}
}
void fneib(int b[11][11],int tem[11],int mi,int fron[11]){
//此节点指向下几个节点,将他们的tem置为此节点tem+路长
for(int i=1;i<11;i++){
int gen=0;
if(b[mi][i]!=0){
gen=b[mi][i]+tem[mi];
if(gen<tem[i]){
tem[i]=gen;
fron[i]=mi;
}
}
}
}
int main()
{
int b[11][11]={0}; //创建路径矩阵,b[i][j]表示Ni到Nj的距离,初始全为0
b[1][2]=2;
b[1][3]=3;
b[1][4]=3;
b[2][4]=4;
b[2][5]=5;
b[3][4]=1;
b[3][6]=5;
b[3][7]=6;
b[4][6]=4;
b[6][8]=5;
b[6][9]=7;
b[8][10]=7;
b[9][10]=6;
b[2][1]=2; //无向路径,反过来再来一次
b[3][1]=3;
b[4][1]=3;
b[4][2]=4;
b[5][2]=5;
b[5][3]=5;
b[4][3]=1;
b[7][3]=6;
b[8][6]=5;
b[4][6]=4;
b[9][6]=7;
b[10][8]=7;
b[10][9]=6;
int tem[11],p[11],fron[11]; //暂时指示tem[i],永久指示p[i]
for(int i=1;i<11;i++){ //初始化参数
tem[i]=100;
p[i]=0;
fron[i]=0;
}
tem[1]=0;
fron[1]=1;
while(1){
fmin(tem,p); //调用函数,取所有tem最小值
printf("%d,%d\n",miv,mi);
fneib(b,tem,mi,fron); //调用函数,使下几个节点tem更新
for(int i=1;i<11;i++){
printf("p[%d]:%d,tem:%d\n\n",i,p[i],tem[i]);
}
int over=1;
for(int i=1;i<11;i++){ //当所有永久指示p都为1时结束
if(p[i]==0)over=0;
}
if (over==1)
break;
}
for(int i=1;i<11;i++){
printf("tem[%d]=%d,fron:%d\n",i,tem[i],fron[i]);
}
printf("\n\nthe nearest route from N1 to N10 is %d\n",tem[10]);
return 0;
}