该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
只用到了数组,所以过于简陋,功能也不强大#include
#define N 6
int main()
{
int A[N][N],B[N],C[N],Du[N][N],i,j,k,l=N,x,y,z,min;
printf("输入赋权矩阵:\n");
for(i=0;i
for(j=0;j
scanf("%d",&A[i][j]);
for( ; ; )
{
for(i=0;i
{
B[i]=0;
C[i]=-1;
}
printf("输入起始点 终止点的编号\n"); /*大于或等于1*/
scanf("%d%d",&x,&y);
B[x-1]=1;
C[0]=x-1;
for(i=0;i
for(j=0;j
if(B[j]!=1)
Du[i][j]=A[x-1][j];
for(j=0;j
if((B[j]!=1) && (Du[x-1][j]!=0))
min=Du[x-1][j];
for(i=0,j=0;j
if(B[j]!=1)
{
if(Du[i][j]==0)
min=min;
else if(min>=Du[i][j])
{
min=Du[i][j];
z=j;
}
}
B[z]=1;
C[1]=z;
printf("判断过程(最小指标点):\n");
if(min==Du[i][y-1])
printf("%d\n最短路:\n%d\n",z+1,min);
else
{
for(i=1;i
{
for(j=0;j
if(B[j]!=1)
{
if(Du[i-1][j]==0 && A[z][j]==0)
Du[i][j]=0;
else if(Du[i-1][j]!=0 && ((Du[i-1][j] < Du[i-1][z] + A[z][j]) || A[z][j]==0))
Du[i][j]=Du[i-1][j];
else
Du[i][j]=Du[i-1][z]+A[z][j];
if(Du[i][j]>0)
min=Du[i][j];
}
for(k=0;k
if(B[k]!=1)
if(Du[i][k]==0)
{
min=min;
continue;
}
else if(min>=Du[i][k])
{
min=Du[i][k];
z=k;
}
B[z]=1;
C[i+1]=z;
if(min==Du[i][y-1])
break;
}
for(i=0;i
{
printf("%d ",C[i]+1);
if(C[i]==-1)
l=i;
}
printf("\n最短路:\n");
printf("%d\n",min);
}
}
}