Dijkstra算法

试题描述:要求系统中记录了校园中的教学楼、图书馆、食堂、田径场、篮球场、超市、医务室等坐标信息和连接这些坐标的路径信息,每条路径包含两个坐标间的距离和预计消耗的卡路里,能进行坐标点的增加和删除,能够满足不同用户的查询,如:两坐标之间的最高卡路里路线和最短距离路线。要求有运行结果截图。

写的复杂了点,但时间紧迫,懒得优化了,以后有空重写下。

#include <bits/stdc++.h>
using namespace std;
int num = 7, Maxn = 0xfff, Minn = -0xfff;
struct node {
    int Distance;
    int Calorie;
};
struct location {
    string name;
    int Known = 0;
    int Dist = Maxn;
    int Calo = Minn;
    int path = -1;
};
struct node Graph[100][100];
struct location Adress[100];
string School[100] = {"教学楼", "图书馆", "食堂", "田径场", "篮球场", "超市", "医务室"};
void InitGraph() {
    srand((int)time(NULL));
    int Dist1,Dist2;
    for (int i = 0; i < num  ; ++i) {
        for (int j = i; j < num; ++j) {
            if (i == j) {
                Graph[i][j].Distance = Maxn;
                Graph[i][j].Calorie = 0;
                continue;
            }
            Dist1=rand()%100;
            Dist2=rand()%100;
            Graph[i][j].Distance = Dist1;
            Graph[i][j].Calorie = Dist2;
            Graph[j][i].Distance = Dist1;
            Graph[j][i].Calorie = Dist2;
        }
        Adress[i].name = School[i];
    }
    cout << "地图初始化完成!" << endl;
}
void InitAgain(){
    for(int i=0;i<num;i++){
        Adress[i].Known=0;
        Adress[i].path=-1;
        Adress[i].Dist=Maxn;
        Adress[i].Calo=Minn;
        Adress[i].name=School[i];
    }
}
void Dist_Dijkstra(string start, string end) {
    int loc_end, loc_start, Maxn;
    for (int i = 0; i < num; ++i) {
        if (School[i] == end) loc_end = i;
        if (School[i] == start) loc_start = i;
    }
    int Tloc, MinLoc = Maxn;
    for (int i = 0; i < num; i++) {
        if (i == loc_start) continue;
        Adress[i].path = loc_start;
        Adress[i].Dist = Graph[loc_start][i].Distance;
    }
    Adress[loc_start].Known = 1;
    while (1) {
        Minn=0xfff;
        for (int i = 0; i < num; i++) {
            if (Adress[i].Known == 1) continue;
            if (Adress[i].Dist < Minn) {
                Tloc = i;
                Minn = Adress[i].Dist;
            }
        }
        if (Tloc == loc_end) break;
        if (Adress[Tloc].path == -1) break;
        Adress[Tloc].Known = 1;
        for (int i = 0; i < num; ++i) {
            if (Adress[i].Known == 1 || i == Tloc) continue;
            if (Adress[Tloc].Dist + Graph[Tloc][i].Distance < Adress[i].Dist) {
                Adress[i].Dist = Adress[Tloc].Dist + Graph[Tloc][i].Distance;
                Adress[i].path = Tloc;
            }
        }
    }
}
void Calo_Dijkstra(string start, string end) {
    int loc_end, loc_start, Maxn;
    for (int i = 0; i < num; ++i) {
        if (School[i] == end) loc_end = i;
        if (School[i] == start) loc_start = i;
    }
    int Tloc, MinLoc = Maxn;
    for (int i = 0; i < num; i++) {
        if (i == loc_start) continue;
        Adress[i].path = loc_start;
        Adress[i].Calo = Graph[loc_start][i].Calorie;
    }
    Adress[loc_start].Known = 1;
    while (1) {
        Maxn=-0xfff;
        for (int i = 0; i < num; i++) {
            if (Adress[i].Known == 1) continue;
            if (Adress[i].Calo > Maxn) {
                Tloc = i;
                Maxn = Adress[i].Calo;
            }
        }
        if (Tloc == loc_end) break;
        if (Adress[Tloc].path == -1) break;
        Adress[Tloc].Known = 1;
        for (int i = 0; i < num; ++i) {
            if (Adress[i].Known == 1 || i == Tloc) continue;
            if (Adress[Tloc].Calo + Graph[Tloc][i].Calorie > Adress[i].Calo) {
                Adress[i].Calo = Adress[Tloc].Calo + Graph[Tloc][i].Calorie;
                Adress[i].path = Tloc;
            }
        }
    }
}
void PrintPath(int end) {
    if (Adress[end].path != -1) {
        PrintPath(Adress[end].path);
        cout << " to ";
    }
    cout << Adress[end].name;
}
int main(int argc, char const *argv[]) {
    char c='y';
    string start,end;
    int dis,cal;
    InitGraph();
    while(c=='y'){
        system("cls");
        cout<<"请输入操作:"<<endl;
        cout<<" a:增加地点"<<endl;
        cout<<" d:删除地点"<<endl;
        cout<<" h:最高卡路里查询"<<endl;
        cout<<" l:最短距离查询"<<endl;
        cin>>c;
        switch (c){
            int tmp;
            case 'l':
                cout<<"请输入起始地点:";
                cin>>start;
                cout<<"请输入目标地点:";
                cin>>end;
                Dist_Dijkstra(start,end);
                for (int i = 0; i < num; ++i)
                    if (School[i] == end){
                        tmp = i;
                        break;
                    }
                PrintPath(tmp);
                cout<<endl;
                InitAgain();
                break;
            case 'h':
                cout<<"请输入起始地点:";
                cin>>start;
                cout<<"请输入目标地点:";
                cin>>end;
                Calo_Dijkstra(start,end);
                for (int i = 0; i < num; ++i)
                    if (School[i] == end){
                        tmp = i;
                        break;
                    }
                PrintPath(tmp);
                cout<<endl;
                InitAgain();
                break;
            case 'a':
                cout<<"请输入增加的地点名称:";
                cin>>start;
                School[num]=start;
                for(int i=0;i<num-1;i++){
                    cout<<"请输入"<<start<<"到"<<School[i]<<"的距离和卡路里消耗(空格分隔):";
                    cin>>dis>>cal;
                    Graph[i][num].Distance=dis;
                    Graph[i][num].Calorie=cal;
                    Graph[num][i].Distance=dis;
                    Graph[num][i].Calorie=cal;
                }
                num++;
                InitAgain();
                break;
            case 'd':
                cout<<"请输入删除的地点名称:";
                cin>>end;
                for (int i = 0; i < num; ++i)
                    if (School[i] == end){
                        tmp = i;
                        break;
                    }
                for(int i=tmp;i<num-1;i++){
                    School[i]=School[i+1];
                }
                cout<<"删除成功!"<<endl;
                num--;
                InitAgain();
                break;
            default:
                cout<<"无该操作!"<<endl;
        }
        cout<<"继续或退出(y/任意键):";
        cin>>c;
    }
    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、数据库课程设计要求见 文档”数据库原理及应用课程设计要求“ 2、该压缩包里含参考资料、部分源文件、成品3个文件夹 3、参考资料文件夹里含学习课件、相关CDM图、业务流程图、数据字典、流程图 应该怎样做的资料 实验指导书、还有些习题作业、这个实验无关的sql语句练习、 2个另外独立完整的数据库课程设计:图书馆管理系统、小型超市管理系统 4、部分源文件文件夹里含文档里画的一些流程图、CDM图之类的、还有生成的SQL脚本 5、成品文件夹只含一个完成的数据库设计。 说明: 由于自己这个数据库设计成绩只得了个中,做得实在是很简单,呵呵,所以只能给大家做个参考而已。 目录与要求: 多媒体教室申请管理系统 1.项目背景 1.1选题背景 对所选题目涉及的企业(或行业)背景和主要业务活动内容进行必要的说明,指出当前业务管理模式或流程中存在的主要问题,阐述对其信息化或对现有系统进行改进的必要性和意义所在。 1.2系统目标和实现技术 通过初步的分析,给出未来要实现的系统功能目标,绘制系统功能目标图。并简要说明系统欲采用的软件体系结构、平台、DBMS和开发工具等。 2 需求分析 紧密围绕所确定的系统目标,展开详细的需求分析,该阶段内容主要有: 2.1业务流程分析 对所涉及的业务流程进行分析,边分析边绘制业务流程图。业务流程图可以是BPM或VISIO等形式。 2.2数据流程分析 在业务流程调查和分析的基础上,按照分层、概括、抽象的原则描述系统的数据流程图,要求数据流程图必须分层表达,图中所出现的数据对象分类顺序编号,以便进行编写对应的详细数据字典。该部分的数据流程图应至少3张。 2.3数据字典 按照数据流程图分层和每层数据流程图数据对象出现的先后顺序编写相对应的详细的数据字典,数据字典应包含数据流、数据存储、数据处理、外部实体和数据项等五个部分。 3 概念结构设计 在需求分析的基础上,应用概念模型的相关设计方法,完成数据库的概念模型设计。所设计的概念模型应为CDM图。 4逻辑结构设计 粘贴根据CDM图转换来的PDM图 5物理结构设计 粘贴由PDM生成数据库过程中的SQL脚本,为节省篇幅,可只保留原始脚本中的头文件和生成基本表的脚本,同时注意头文件中DBMS的名称应与项目背景介绍中的信息一致,并且注意头文件中系统时间的正确性。 6 总结 对本次课程设计的主要收获进行总结,并指出整个设计工作存在的问题或需要进行部改进的地方。 7 参考文献 如实列出对本次课程设计过程中参考了的书籍、网络文献或软件产品。 小型超市管理系统 1、项目计划 1.1系统开发目的 1.2背景说明 1.3项目确立 1.4应用范围 1.5定义 1.6参考资料 2、逻辑分析与详细分析 2.1系统功能 2.2数据流图 2.3用户类型与职能 2.4系统开发步骤 2.5系统环境需求 2.6系统安全问题 3、基于UML的建模 3.1语义规则 3.2 UML模型 3.3系统实现图 4、概要设计文档 5、逻辑设计文档 6、物理设计文档 7、小结 图书馆管理系统 1、项目计划 1.1系统开发目的 1.2背景说明 1.3项目确立 1.4应用范围 1.5定义 1.6参考资料 2、逻辑分析与详细分析 2.1系统功能 2.2数据流图 2.3用户类型与职能 2.4系统开发步骤 2.5系统环境需求 2.6系统安全问题 3、基于UML的建模 3.1语义规则 3.2 UML模型 3.3系统实现图 4、概要设计文档 5、逻辑设计文档 6、物理设计文档 7、小结
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值