弗洛伊德算法,最短路径长度正确,但是最短路径结果path最后会出现重复

fxbbing 2015-07-09 03:50:57
#define maxsize 92
#include<stdio.h>
#include<math.h>
typedef struct{
double arcs[maxsize][maxsize];
int vexNum;
}MGraph;
typedef struct{
double x,y;
}Point;
void floyd(MGraph G);
int main()
{
int x, y;
MGraph graph;
Point point[maxsize];
graph.vexNum = maxsize;
//初始化
for (int i = 0; i < graph.vexNum; i++)
for (int j = 0; j < graph.vexNum; j++)
{
graph.arcs[i][j]=10000;
if (i == j)
graph.arcs[i][j] = 0;
}
printf("请输入顶点坐标:\n");
for (int i = 0; i < graph.vexNum; i++)
{
scanf("%lf%lf", &point[i].x, &point[i].y);
}
printf("请输入相邻顶点标号:(0 0结束)\n");
while (1)
{
scanf("%d%d",&x,&y);
if (x == 0 && y == 0)
break;
else{
graph.arcs[x - 1][y - 1] = sqrt((point[x - 1].x - point[y - 1].x)*(point[x - 1].x - point[y - 1].x) + (point[x - 1].y - point[y - 1].y)*(point[x - 1].y- point[y - 1].y));
graph.arcs[y - 1][x - 1] = sqrt((point[x - 1].x - point[y - 1].x)*(point[x - 1].x - point[y - 1].x) + (point[x - 1].y - point[y - 1].y)*(point[x - 1].y - point[y - 1].y));
}
}
floyd(graph);
}
void floyd(MGraph G)
{
int i, j, k, m, n;
double d[maxsize][maxsize];
int path[maxsize][maxsize][maxsize];
//初始化
for (i = 0; i < G.vexNum; i++)
for (j = 0; j < G.vexNum; j++)
{
d[i][j] = G.arcs[i][j];
for (k = 0; k < G.vexNum; k++)
path[i][j][k] = -1;
}
//存放初始路径
for (i = 0; i < G.vexNum; i++)
for (j = 0; j < G.vexNum; j++)
if (d[i][j] != 10000 && d[i][j] != 0)
{
path[i][j][0] = i;
path[i][j][1] = j;
}
//迭代
for (k = 0; k < G.vexNum; k++)
{
for (i = 0; i < G.vexNum; i++)
for (j = 0; j < G.vexNum; j++)
if (d[i][k] != 0 && d[i][k] != 10000 && d[k][j] != 0 && d[k][j] !=10000&& d[i][k] + d[k][j] < d[i][j])
{
d[i][j] = d[i][k] + d[k][j];
for (m = 0; m < G.vexNum; m++)
{
if (path[i][k][m] != -1)
path[i][j][m] = path[i][k][m];
else
break;
}
for (n = 1; n < G.vexNum; n++)
{
if (path[k][j][n] != -1)
path[i][j][m++] = path[k][j][n];
else
break;
}
}
}
//输出结果

printf("最短路径长度:\n");
for (m = 0; m < G.vexNum; m++)
{
for (n = 0; n < 20; n++)
printf("%6.2lf",d[m][n]);
printf("\n");
}
/*printf("最短路径");
for (i = 0; i < G.vexNum; i++)
{
for (j = 0; j < G.vexNum; j++)
{
printf("%d-->%d:",i,j);
for (m = 0; path[i][j].pa[m] != -1; m++)
printf("%d ", path[i][j].pa[m]);
if (m != 0)
printf("\b\b");
printf("\t\t\t");
}
printf("\n");
}*/
}
...全文
294 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
fxbbing 2015-07-10
  • 打赏
  • 举报
回复
引用 2 楼 zhangxiangDavaid 的回复:
Floyd算法 http://blog.csdn.net/zhangxiangdavaid/article/details/38366923
您好,我这个path是一个三维数组,输入的图的数据量比较大,您知道为什莫这个路径中会出现重复的路径吗?
fxbbing 2015-07-09
  • 打赏
  • 举报
回复
path后面的部分会出现重复,节点数据指的是节点的横纵坐标,路径权值是代码中计算出来的,不是输入的

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧