数据结构-图的储存的应用

图的存储和应用

实验目的

  1. 掌握图的基本结构和操作方法。
  2. 培养学生灵活使用数据结构解决实际问题的能力 。

实验内容

设计一个交通咨询系统,能让旅客咨询从任一个城市到另一个城市之间的最短路径(里程)。城市之间的距离如下图所示(顶点表示各个城市):
在这里插入图片描述

为简化任务,请完成以下最短路径咨询任务:

  1. 请求取从城市 A 到其余城市的最短路径。
  2. 请求取城市 B 到城市 D 之间的最短路径。
  3. 要求:城市信息图可以选择手动输入,也可以通过文件读入。

代码:

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








  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值