[数据结构]校园导游系统_Floyd算法求最短路径_C语言

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;
}

运行示例

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值