思路:
这个题的核心代码是这个:
for(i=1;i<10;i++){
for(j=i-1;j>=0;j--){
if(a[j][i]+value[j]
value[i]=a[j][i]+value[j];
path[i]=j;}
}
}
i是终点,j是起点,value【i】里面存放的是起点到节点i的最短路径,这个代码块的意义在于一直 求i节点前的所有节点到i节点的最短路径,将求得的最短路径放入value【i】中,path【i】里存放的是i节点的前驱节点
题目:
因为我的那个破编译器在定义变量的时候只有第一行有效,所以我的数组是直接赋值了的,你们的编译器允许的话,还是可以把数组的值改为v的,那样就可以适用于别的有向图了,如:a【10】【10】改为a【v】【v】
代码:
#include
#define max 100
//v是顶点数 e是边
void shortdistance(int a[10][10]){
//j是起点,i是终点,path【i】存的是i的起点,value【i】存的是从起点到i的最短路径
int i,j,path[10],value[10];
for(i=0;i<10;i++){
path[i]=max;
value[i]=max;
}
path[0]=-1;
value[0]=0;
for(i=1;i<10;i++){
for(j=i-1;j>=0;j--){
if(a[j][i]+value[j]
value[i]=a[j][i]+value[j];
path[i]=j;}
}
}
printf("%d ",10);
i=9;
j=0;
while(path[i]>=0){
printf(" <- %d",path[i]+1);
i=path[i];
j++;
if(j==3){
printf(" <- 1n");
break;
}
}
printf("%dn",value[9]);
}
int main(){
int e,v,start,end,weight,i,j,a[10][10];
printf("请输入节点数和边数:");
scanf("%d %d",&v,&e);
for(i=0;i
for(j=0;j
a[i][j]=max;
}
}
printf("请输入起点,终点以及边的权值:");
for(i=0;i
scanf("%d %d %d",&start,&end,&weight);
a[start-1][end-1]=weight;
}
shortdistance(a);
}
//测试数据



