#include "stdio.h"
#include "conio.h"
#define n 6 /*图的顶点数*/
#define k 4 /*图的段数*/
#define MAX 1000
typedef int NodeNumber; /*节点编号*/
typedef int CostType; /*成本值类型*/
CostType cost[n][n];
NodeNumber path[k]; /*存储最短路径的数组*/
NodeNumber cur= -1;
void creatgraph(CostType *cost[n][n]) /*创建图的成本矩阵*/
{ int i,j;
printf("请输入图的成本矩阵:/n");
for(i=0;i
}
void outgraph(CostType *cost[n][n]) /*输出图的成本矩阵*/
{ int i,j;
printf("输出图的成本矩阵:/n");
for(i=0;i
printf("/n");
}
}
/* 使用向前递推算法求多段图的最短路径 */
void FPath(CostType *cost[n][n],NodeNumber *path[k])
{ int i,j,length,temp,v[n],d[n];
for(i=0;i
{ for(length=MAX,j=i+1;j<=n-1;j++)
if(cost[i][j]>0 && (cost[i][j])+v[j]
v[i]=length;
d[i]=temp;
}
path[0]=0;
path[k-1]=n-1;
for(i=1;i<=k-2;i++) (path[i])=d[path[i-1]];
}
/* 使用向后递推算法求多段图的最短路径 */
void BPath(CostType *cost[n][n],NodeNumber *path[k])
{ int i,j,length,temp,v[n],d[n];
for(i=0;i
{ for(length=MAX,j=i-1;j>=0;j--)
if(cost[j][i]>0 && (cost[j][i])+v[j]
v[i]=length;
d[i]=temp;
}
path[0]=0;
path[k-1]=n-1;
for(i=k-2;i>=1;i--) (path[i])=d[path[i+1]];
}
/* 查找结点i的后向邻接结点 */
int findbackward(CostType *cost[n][n],NodeNumber i,NodeNumber cur)
{ int j;
for(j=cur+1;j
return -1;
}
/* 查找结点i的前向邻接结点 */
int findforward(CostType *cost[n][n],NodeNumber i,NodeNumber cur)
{ int j;
for(j=cur+1;j
return -1;
}
/* 输出最短路径序列 */
void outpath(NodeNumber *path[k])
{ int i;
for(i=0;i
}
main()
{
NodeNumber m,t;
creatgraph(&cost);
outgraph(&cost);
FPath(&cost,&path);
printf("输出使用向前递推算法后的最短路径:/n");
outpath(&path);
printf("/n输出使用向后递推算法后的最短路径:/n");
BPath(&cost,&path);
outpath(&path);
printf("/n输入要查找邻接结点的编号:");
scanf("%d",&t);
printf("结点 %d 的前向邻接结点为: /n");
cur=findforward(&cost,t,cur);
while(cur!=-1) /*找剩下的前向邻接结点*/
{ printf("%d/t",cur);cur=findforward(&cost,t,cur);}
printf("/n结点 %d 的后向邻接结点为:/n");
cur=findbackward(&cost,t,cur);
while(cur!=-1) /*找剩下的后向邻接结点*/
{ printf("%d/t",cur);cur=findbackward(&cost,t,cur);}
getch();
}