• 迪杰斯特拉算法求最短路径问题


    题目要求

    实验项目名称:图及其应用

    一、实验目的:

    1)掌握图的常用存储结构;

    2)掌握图的遍历操作;

    3)应用图结构解决具体问题

    二、实验题目:

      编写一个校园导游程序,为来访的客人提供各种信息查询服务。   主要功能:   1) 设计学校的校园平面图,所含景点不少于10个:顶点表示景点,边表示路径等。   2)为客人提供图中任意景点相关信息的查询   3)为客人提供图中任意景点的问路查询,即查询人以景点间的一条最短路径。   要求:   

    (1) 设计一个主界面

    (2) 设计功能菜单,供用户选择

    (3) 有一定的实用性。

    程序代码

    .h

    #pragma once
    #include<string>
    #include<iostream>
    using namespace std;
    #include<fstream>
    #include<iomanip>
    class MinWay
    {
    int point[10][10];
    string name[10];
    int begin;
    int finish;

    public:
    MinWay(void);
    ~MinWay(void);
    bool getPoint(); //得到点
    void show(); //显示所有姓名
    void minway(); //得到最小路径
    };

    .cpp

    #include "MinWay.h"


    MinWay::MinWay(void)
    {
    fstream infile("data.txt",ios::in);
    //点集的读入
    if(!infile)
    cout<<"the file is not find,please creat the file"<<endl;
    else
    {for(int i=0;i<10;i++)
    for(int j=0;j<10;j++)
    infile>>point[i][j];
    for(int i=0;i<10;i++)
    infile>>name[i];
    }
    infile.close();
    //其他值进行初始化
    begin=-1;
    finish=-1;
    }


    MinWay::~MinWay(void)
    {

    }
    void MinWay::show()
    {
    for(int i=0;i<10;i++)
    cout<<name[i]<<" ";
    }
    bool MinWay::getPoint(){
    cout << "全部景点信息为 ";
    for (int i = 0; i < 10; i++) {
    cout << i + 1 << "、" << name[i] << " ";
    }
    cout << "输入景点对应的数字作为选择 ";
    cout << "输入起点信息 ";
    cin >> begin;
    begin--;
    if (begin < 0 || begin>9)
    return false;
    cout << "输入终点信息 ";
    cin >> finish;
    finish--;
    if (finish < 0 || finish>9)
    return false;
    return true;
    }
    void MinWay::minway(){
    int headpath[10];
    int minlong=666;
    int minpoint=begin;
    int longs[10];
    bool judge[10];
    if(finish<0||begin<0){
    cout<<"输入错误 "<<endl;
    return;
    }

    //进行初始化
    for(int i=0;i<10;i++){
    longs[i]=point[begin][i];
    judge[i]=false;
    headpath[i] = begin;
    }
    headpath[begin]=-1;
    judge[begin]=true; //起点加入判断数组
    longs[begin]=0; //起点到起点的距离设置为0
    //得到当前最短长度
    for (int k = 1; k < 10; k++) {
    minlong = 666;
    for (int i = 0; i < 10; i++) {
    if (!judge[i] && longs[i] < minlong)
    {
    minlong = longs[i];
    minpoint = i;
    }
    }
    //刷新
    judge[minpoint] = true;
    longs[minpoint] = longs[headpath[minpoint]] + minlong;
    if (minpoint == finish) //找到最短路径跳出循环
    break;

    //更新最小长度 longs数组
    for (int i = 0; i < 10; i++) {
    if (!judge[i]) {
    int flag = 666;
    int headpoint = -1;
    //在为加入成功点集中选取最小的距离
    for (int j = 0; j < 10; j++) {
    if (judge[j] && point[i][j] < flag)
    {
    flag = point[i][j];
    headpoint = j;
    }
    }
    headpath[i] = headpoint;
    longs[i] = flag;
    }
    }
    }

    int head;
    head = headpath[finish];
    string namepath[10];
    int pathNum = 0;
    namepath[pathNum++] = name[finish];
    while (true) {
    if (head<0)
    break;
    namepath[pathNum++] = name[head];
    head = headpath[head];
    }
    if (namepath[pathNum-1] != name[begin]) {
    cout << "未找到路径 ";
    }
    else {
    cout << "最短路径为 ";
    for (int i = pathNum-1; i >= 0; i--) {
    cout << namepath[i] << "-->";
    }
    }
    cout <<" 长短为 " << longs[finish]<<endl;
    }

    main

    #include"MinWay.h"
    void main()
    {
    MinWay test;
    while (true)
    {
    cout << "请选择功能 ";
    cout << "1、查找最短路径 ";
    cout << "2、查看全部景点 ";
    cout << "3、退出 ";
    int choice;
    cin >> choice;
    if (choice==1)
    {
    while (!test.getPoint()) {
    cout << "输入错误,从新输入 ";
    }
    test.minway();
    }
    else if (choice==2) {
    test.show();
    }
    else {
    break;
    }

    }
    }

  • 相关阅读:
    第一章
    第三章
    第四章
    第十章 读书笔记
    第八章 读书笔记
    第九章 读书笔记
    第7章实验心得
    第六章实验心得
    第五章心得体会
    第四章实验心得
  • 原文地址:https://www.cnblogs.com/zhanghengstdu/p/6154883.html
Copyright © 2020-2023  润新知