69,381
社区成员
发帖
与我相关
我的任务
分享
#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");
}*/
}