这题我在上个代码中已经写出来对应函数了,就在贴一遍吧。
题目
代码
#include <stdio.h>
#include <stdlib.h>
struct graphList
{
int vexNum;
int graph[120][120];
};
int P[120][120];//记录对应点的最小路径的前驱点,例如p(1,3) = 2 说明顶点1到顶点3的最小路径要经过2
void createNewGraphList(struct graphList *gList)
{
int i,j;
scanf ("%d", &(gList -> vexNum));
for (i=0;i < gList->vexNum; i++)
{
for (j = 0; j < gList -> vexNum; j++)
{
scanf ("%d", &(gList -> graph[i][j]));
}
}
}
void floydAlgorithm(struct graphList *gList)
{
int v,w,k;
//初始化floyd算法的最小路径矩阵
for(v = 0; v < gList->vexNum; v++){
for(w = 0; w < gList->vexNum; w++){
P[v][w] = w;
}
}
//这里是弗洛伊德算法的核心部分
//k为中间点
for(k=0;k<gList->vexNum;k++)
{//v为起点
for(v=0;v<gList->vexNum;v++)
{ //w为终点
for(w=0;w<gList->vexNum;w++)
{
if(gList->graph[v][w]>gList->graph[v][k]+gList->graph[k][w])
{
gList->graph[v][w]=gList->graph[v][k]+gList->graph[k][w];//更新最小路径
P[v][w] = P[v][k];//更新最小路径中间顶点
}
}
}
}
}
void putOutMinStepNum(struct graphList *gList)
{
int n;
int a[10];
int i, j,k=0;
scanf ("%d", &n);//需输出的个数
while (n--)
{
scanf ("%d%d", &i, &j);
a[k]=gList -> graph[i][j];
k++;
}
for(i=0;i<k;i++)
printf("%d\n",a[i]);
}
void putOutMinStep()
{
int i,j;
int n;
int a[100][100];
scanf("%d",&n);
for(int t=0;t<n;t++)
{
scanf("%d %d",&a[t][0],&a[t][1]);
}
for(int t=0;t<n;t++)
{
int k=P[a[t][0]][a[t][1]];
printf("%d\n", a[t][0]);//打印起点
while(k!=a[t][1])
{
printf("%d\n", k);//打印中间点
k = P[k][a[t][1]];
}
printf("%d\n",k);//打印中间点
}
}
int main()
{
struct graphList gList;
createNewGraphList(&gList);
floydAlgorithm (&gList);
//putOutMinStepNum (&gList);
putOutMinStep();
return 0;
}
如图: