图的存储和应用
实验目的
- 掌握图的基本结构和操作方法。
- 培养学生灵活使用数据结构解决实际问题的能力 。
实验内容
设计一个交通咨询系统,能让旅客咨询从任一个城市到另一个城市之间的最短路径(里程)。城市之间的距离如下图所示(顶点表示各个城市):
为简化任务,请完成以下最短路径咨询任务:
- 请求取从城市 A 到其余城市的最短路径。
- 请求取城市 B 到城市 D 之间的最短路径。
- 要求:城市信息图可以选择手动输入,也可以通过文件读入。
代码:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
int A = 0, B = 1, C = 2, D = 3, E = 4, F = 5, G = 6;
int choice;
typedef struct
{
int distance[7][7];
int direct[7][7];
int way[7][7];
}MGraph;
void Input_Keyboard(MGraph &M){
int l, n, m;
for (int i = 0; i < 7; i++){
for (int j = 0; j < 7; j++){
M.distance[i][j] = 999999;
}
}
printf("请输入两个城市的代号以及路程,输入'0'结束:(A:0 B:1 C:2 D:3 E:4 F:5 G:6)\n");
while (true){
scanf("%d %d %d", &l, &n, &m);
if (l == 0)
break;
M.distance[l][n] = m;
}
}
void Input_File(MGraph &M){
int l, n, m;
for (int i = 0; i < 7; i++){
for (int j = 0; j < 7; j++){
M.distance[i][j] = 999999;
}
}
FILE* fp;
fp=fopen("distance.txt", "r");
if(!fp){
printf("文件打开失败\n");
exit(0);
}
for (int i = 0; i < 100; i++){
fscanf(fp, "%d %d %d", &l, &n, &m);
M.distance[l][n] = m;
}
fclose(fp);
}
void Input(MGraph &M){
printf("请选择城市信息图导入方式:\n");
printf("------1、手动输入------\n");
printf("------2、文件读入------\n");
scanf("%d", &choice);
switch (choice){
case 1:Input_Keyboard(M); break;
case 2:Input_File(M); break;
default:printf("输入有误,请重新输入!\n");
Input(M);
}
for (int i = 0; i < 7; i++){
for (int j = 0; j < 7; j++){
if (M.distance[i][j] == 999999){
M.direct[i][j] = 0;
}
else{
M.direct[i][j] = 1;
}
M.way[i][j] = j;
}
}
}
void ShortestPath_FLOYD(MGraph &M){
for (int i = 0; i < 7; i++){
for (int j = 0; j < 7; j++){
for (int k = 0; k < 7; k++){
if (M.distance[j][k] > M.distance[j][i] + M.distance[i][k]){
M.distance[j][k] = M.distance[j][i] + M.distance[i][k];
M.way[j][k]=M.way[j][i];
}
}
}
}
}
void check(MGraph &M){
int n, m;
printf("请输入你想查询最短路径的两个城市的代号:(A:0 B:1 C:2 D:3 E:4 F:5 G:6)\n");
scanf("%d %d", &n, &m);
if (M.distance[n][m] != 999999){
printf("两城市最短距离为%d\n", M.distance[n][m]);
printf("路径为:");
char path;
while(n!=m){
switch(n){
case 0:path='A';break;
case 1:path='B';break;
case 2:path='C';break;
case 3:path='D';break;
case 4:path='E';break;
case 5:path='F';break;
case 6:path='G';break;
}
printf("%c->",path);
n=M.way[n][m];
}
switch(m){
case 0:path='A';break;
case 1:path='B';break;
case 2:path='C';break;
case 3:path='D';break;
case 4:path='E';break;
case 5:path='F';break;
case 6:path='G';break;
}
printf("%c\n", path);
printf("查询成功!\n");
}
else{
printf("两城市之间没有路径\n");
}
}
int main(){
MGraph Graph;
Input(Graph);
ShortestPath_FLOYD(Graph);
check(Graph);
}