今天的弗洛伊德算法求这道题和迪杰斯特拉算法很类似,我把我很喜欢的一篇文章的解释这个算法的图放在这里了,希望对大家理解有帮助。也希望大佬能多多指点。
弗洛伊德算法图解
即
(盗图王中王)
题目
代码
#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;
scanf("%d %d",&i,&j);
int k=P[i][j];
printf("path: %d", i);//打印起点
while(k!=j)
{
printf("%d\n", k);//打印中间点
k = P[k][j];
}
printf("%d",k);//打印中间点
}
int main()
{
struct graphList gList;
createNewGraphList(&gList);
floydAlgorithm (&gList);
putOutMinStepNum (&gList);
//putOutMinStep();
}
输出:
说实话这个弗洛伊德算法比迪杰斯特拉算法简单还好用,真是不像话。