Floyd算法
校园导游咨询系统
地图
代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 50
#define INFINITY 100 //无穷大表示两个点不邻接
#define MAX_VEX 12 //顶点数
//顶点信息
typedef struct {
int num; //景点代号
char name[10]; //景点名称
char intro[100]; //景点介绍
}VERTEX;
//图的邻接矩阵表示
typedef struct{
VERTEX vex[MAX]; //顶点
int edge[MAX][MAX]; //边
int vexNum; //顶点数量
int edgeNum; //边数量
}MGraph;
void printMenu() {
printf("欢迎来到姚专导游咨询系统!\n");
printf("1.天软 2.游泳馆 3.体育馆 4.望星 5.泮湖 6.艺缘\n");
printf("7.旭日 8.图书馆 9.东苑 10.西苑 114.荔枝广场 12.奔月\n");
printf("查询景点请按1\n");
printf("查询路线请按2\n");
printf("输入exit退出程序\n\n");
}
//初始化景点名称
void InitVexNum(MGraph* g) {
strcpy(g->vex[1].name, "天软");
strcpy(g->vex[2].name, "游泳馆");
strcpy(g->vex[3].name, "体育馆");
strcpy(g->vex[4].name, "望星");
strcpy(g->vex[5].name, "泮湖");
strcpy(g->vex[6].name, "艺缘");
strcpy(g->vex[7].name, "旭日");
strcpy(g->vex[8].name, "图书馆");
strcpy(g->vex[9].name, "东苑");
strcpy(g->vex[10].name, "西苑");
strcpy(g->vex[11].name, "荔枝广场");
strcpy(g->vex[12].name, "奔月");
}
//初始化景点简介
void InitVexIntro(MGraph* g) {
strcpy(g->vex[1].intro, "天软简介");
strcpy(g->vex[2].intro, "游泳馆简介");
strcpy(g->vex[3].intro, "体育馆简介");
strcpy(g->vex[4].intro, "望星简介");
strcpy(g->vex[5].intro, "泮湖简介");
strcpy(g->vex[6].intro, "艺缘简介");
strcpy(g->vex[7].intro, "旭日简介");
strcpy(g->vex[8].intro, "亚洲最长,蒸馍你不扶器");
strcpy(g->vex[9].intro, "东苑简介");
strcpy(g->vex[10].intro, "西苑简介");
strcpy(g->vex[11].intro, "你干嘛~哎呦~");
strcpy(g->vex[12].intro, "奔月简介");
}
//设置权值
void SetEdge(MGraph* g, int i, int j, int x) {
g->edge[i][j] = g->edge[j][i] = x;
}
//初始化邻接矩阵
void InitEdge(MGraph* g) {
for (int i = 1; i <= g->vexNum; i++) {
for (int j = 1; j <= g->vexNum; j++) {
g->edge[i][j] = INFINITY;
}
g->edge[i][i] = 0;
}
SetEdge(g, 1, 2, 8);
SetEdge(g, 1, 4, 10);
SetEdge(g, 2, 3, 3);
SetEdge(g, 2, 5, 6);
SetEdge(g, 3, 6, 1);
SetEdge(g, 3, 7, 5);
SetEdge(g, 4, 5, 6);
SetEdge(g, 4, 8, 4);
SetEdge(g, 4, 10, 13);
SetEdge(g, 5, 6, 5);
SetEdge(g, 5, 8, 1);
SetEdge(g, 6, 7, 2);
SetEdge(g, 7, 9, 12);
SetEdge(g, 8, 9, 4);
SetEdge(g, 8, 10, 2);
SetEdge(g, 8, 11, 1);
SetEdge(g, 9, 12, 3);
SetEdge(g, 10, 11, 9);
SetEdge(g, 11, 12, 2);
}
//初始化
void InitGraph(MGraph* g) {
g->vexNum = 12;
g->edgeNum = 19;
for (int i = 1; i <= g->vexNum; i++) {
g->vex[i].num = i;
}
InitVexNum(g);
InitVexIntro(g);
InitEdge(g);
}
void Floyd(MGraph g, int len[][MAX_VEX + 1], int path[][MAX_VEX + 1]) {
//初始化
for (int i = 1; i <= g.vexNum; i++) {
for (int j = 1; j <= g.vexNum; j++) {
len[i][j] = g.edge[i][j];
path[i][j] = -1;
}
}
//考虑以Vk作为中转点
for (int k = 1; k <= g.vexNum; k++) {
//遍历二维数组. 由于是无向图, 只需遍历上三角
for (int i = 1; i <= g.vexNum; i++) {
for (int j = i; j <= g.vexNum; j++) {
if (len[i][j] > len[i][k] + len[k][j]) {
len[i][j] = len[j][i] = len[i][k] + len[k][j];
path[i][j] = path[j][i] = k;
}
}
}
}
}
//递归打印路径
void printPath(MGraph g, int path[][MAX_VEX + 1], int i, int j) {
if (path[i][j] != -1) {
printPath(g, path, i, path[i][j]);
printPath(g, path, path[i][j], j);
}
else
printf("%d.%s -> ", i, g.vex[i].name);
}
int main() {
printMenu();
char s[10] = "0";
MGraph g;
InitGraph(&g);
int len[MAX_VEX + 1][MAX_VEX + 1]; //存放路径长度
int path[MAX_VEX + 1][MAX_VEX + 1]; //存放路径顶点信息
Floyd(g, len, path);
do {
scanf("%s", s);
if (!strcmp(s, "1")) {
int a = 0;
do {
printf("请输入要查询的景点(输入0退出查询):");
scanf("%d", &a);
if (a) {
if (a == 114)
a = 11;
printf("%d.%s\n", g.vex[a].num, g.vex[a].name);
printf("%s\n", g.vex[a].intro);
printf("\n");
}
else {
system("cls");
printMenu();
}
} while (a != 0);
}
else if (!strcmp(s, "2")) {
int a = 0, b = 0;
do {
printf("请输入要查询的路线(输入0 0退出查询):");
scanf("%d %d", &a, &b);
if (a || b) {
if (a == 114)
a = 11;
if (b == 114)
b = 11;
printf("%d.%s和%d.%s之间的最短路径为%d\n", a, g.vex[a].name, b, g.vex[b].name, len[a][b]);
printPath(g, path, a, b);
printf("%d.%s", b, g.vex[b].name);
printf("\n\n");
}
else {
system("cls");
printMenu();
}
} while (a != 0 || b != 0);
}
else if (strcmp(s, "exit"))
printf("输入无效,请重新输入!\n");
} while ( strcmp(s, "exit") != 0 );
return 0;
}
运行示例