您的位置:首页 > 其它

最短路径-Floyd算法

2018-01-23 19:37 274 查看
#include <stdio.h>

#define MAXSIZE     20
#define INITVALUE   65535

typedef struct
{
int vexs[MAXSIZE];
int arcs[MAXSIZE][MAXSIZE];
int vexNum, arcnum;
}Graph;

typedef int PathMin[MAXSIZE][MAXSIZE];
typedef int ShortPathTable[MAXSIZE][MAXSIZE];

void CreatGraph (Graph *G)
{
int i, j, m ,n, weight;
printf("Enter vexNum & arcNum:");
scanf("%d%d", &(G->vexNum), &(G->arcnum));
for(i = 0; i < G->vexNum; i++)
{
printf("Enter %d vex:", i+1);
scanf("%d", &(G->vexs[i]));
for(j = 0; j < G->vexNum; j++)
{
G->arcs[i][j] = INITVALUE;
}
}
for(i = 0; i < G->arcnum; i++)
{
printf("Enter %d arc:", i+1);
scanf("%d%d%d", &m, &n, &weight);
G->arcs[m]
= weight;
}
}

void PrintGraph (Graph *G)
{
int i, j;
for(i = 0; i < G->vexNum; i++)
{
for(j = 0; j < G->vexNum; j++)
{
printf("%d ", G->arcs[i][j]);
}
printf("\n");
}
}

void ShortPathFloyd (Graph *G, PathMin P, ShortPathTable S)
{
int i, j, k;
for(i = 0; i < G->vexNum; i++)
{
for(j = 0; j < G->vexNum; j++)
{
P[i][j] = j;
S[i][j] = G->arcs[i][j];
}
}
for(k = 0; k < G->vexNum; k++)
{
for(i = 0; i < G->vexNum; i++)
{
for(j = 0; j < G->vexNum; j++)
{
if(S[i][j] > G->arcs[i][k]+G->arcs[k][j])
{
S[i][j] = G->arcs[i][k]+G->arcs[k][j];
P[i][j] = P[i][k];
}
}
}
}
}

void PrintFloyd (Graph *G, PathMin P, ShortPathTable S)
{
int i, j, k;
printf("路径规划为:\n");
for(i = 0; i < G->vexNum; i++)
{
for(j = 0; j < G->vexNum; j++)
{
k = P[i][j];
printf("%d--", i);
while(k != j)
{
printf("%d--", k);
k = P[k][j];
}
printf("%d\n", j);
}
}
printf("各点的权值为:\n");
for(i = 0; i < G->vexNum; i++)
{
for(j = 0; j < G->vexNum; j++)
{
printf("%d ", S[i][j]);
}
printf("\n");
}
}

int main ()
{
Graph G;
PathMin P;
ShortPathTable S;
int i;
CreatGraph(&G);
PrintGraph(&G);
ShortPathFloyd(&G, P, S);
PrintFloyd(&G, P, S);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: