图的综合应用-迪杰斯特拉算法(导游图)

简介:

数据结构的大实验  基本跟线性链表的什么学生管理系统没什么区别 还有什么查询景点之类的 对于这种的系统函数写完了 

但是主函数偷懒了没写 唯一有算法的就是迪杰斯特拉求两个景点的最短路径了 图是用邻接矩阵存的


#include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
#define MAX 100
#define oo 99999999
class Ciceroni
{
public:
    int num_xuhao;
    string num_bianhao;//景点编号
    string name;//景点名称
    string pro;//景点简介
};
class map
{
public:
    Ciceroni cic[MAX];//存景点的数组
    int AdjacencyMatrix[MAX][MAX];//景点邻接矩阵
    int sum;//景点的总数
    map();//初始化
    void InputNode();//输入点
    bool AddNode();//加点
    void BuildMap();//构建图
    int AddEdge();//加边 //0-退出 1-正确 2-无点
    void QueryNode();//查询点
    void Queryminpath();//查询两点最短路径 迪杰斯特拉
    void Oueryminpath_s();//查询多点最短路径
};
map::map()
{
    sum=0;
    for(int i=0; i<MAX; i++)
        for(int j=0; j<MAX; j++)
            AdjacencyMatrix[i][j]=oo;
}
void map::InputNode()
{
    cout<<"exit-0"<<endl;
    while(1)
        if(!AddNode())
            break;
    if(!sum)
        cout<<"input defeat"<<endl;
    else
        cout<<"input success"<<endl;
    cout<<endl;
}
bool map::AddNode()
{
    string num;
    cout<<"please input num of node"<<endl;
    cin>>num;
    if(num=="0")
        return 0;
    cic[++sum].num_bianhao=num;
    cout<<"please input name of node"<<endl;
    cin>>cic[sum].name;
    cout<<"please input pro of node"<<endl;
    cin>>cic[sum].pro;
    cic[sum].num_xuhao=sum;
    cout<<endl;
    return 1;
}
int map::AddEdge()
{
    string startnum,endnum;
    int dis,s=-1,e=-1;
    cout<<"input start node's num, end node's num, distance"<<endl;
    cin>>startnum>>endnum>>dis;
    if(startnum==endnum&&endnum=="0"&&!dis)
        return 0;
    for(int i=1; i<=sum; i++)
    {
        if(cic[i].num_bianhao==startnum)
            s=i;
        if(cic[i].num_bianhao==endnum)
            e=i;
        if(s!=-1&&e!=-1)
            break;
    }
    if(s==-1||e==-1)
        return 2;
    AdjacencyMatrix[s][e]=AdjacencyMatrix[e][s]=dis;
    return 1;
}
void map::BuildMap()
{
    cout<<"exit input 0_0_0"<<endl;
    while(1)
    {
        int s=AddEdge();
        if(!s) break;
        if(s==2) cout<<"input num error"<<endl;
        cout<<endl;
    }
    cout<<"bulid success"<<endl;
}
void map::QueryNode()
{
    cout<<"input node's num"<<endl;
    string num;
    cin>>num;
    int flag=0,i,j;
    for(i=1; i<=sum; i++)
        if(cic[i].num_bianhao==num)
        {
            flag=1;
            break;
        }
    if(flag)
    {
        cout<<"node's num:"<<endl<<cic[i].num_bianhao<<endl;
        cout<<"node's name:"<<endl<<cic[i].name<<endl;
        cout<<"node's pro:"<<endl<<cic[i].pro<<endl;
        cout<<"this node can arrive:"<<endl;
        for(j=1; j<=sum; j++)
            if(AdjacencyMatrix[i][j]<oo)
                cout<<"("<<cic[j].num_bianhao<<")"<<cic[j].name<<endl;
    }
    else
        cout<<"no this node"<<endl;
}
void map::Queryminpath()
{
    int distance[MAX];
    bool final[MAX];
    int pre[MAX][MAX];
    int s=-1,e=-1;
    string start,end;
    cout<<"input start num end num"<<endl;
    cin>>start>>end;
    for(int i=1; i<=sum; i++)
    {
        if(cic[i].num_bianhao==start)
            s=i;
        if(cic[i].num_bianhao==end)
            e=i;
        if(s!=-1&&e!=-1)
            break;
    }
    if(s==-1||e==-1)
    {
        cout<<"no node"<<endl;
        return;
    }
    memset(final,0,sizeof(final));
    memset(pre,0,sizeof(pre));
    for(int i=1; i<=sum; i++)
    {
        distance[i]=AdjacencyMatrix[s][i];
        if(distance[i]<oo)
            pre[i][1]=i;
    }
    distance[s]=0;
    final[s]=1;
    for(int i=2; i<=sum; i++)
    {
        int min=oo,p;
        for( int j=1; j<=sum; j++)
            if(!final[j]&&distance[j]<min)
                min=distance[j],p=j;
        final[p]=1;
        for(int j=1; j<=sum; j++)
            if(!final[j]&&(min+AdjacencyMatrix[p][j])<distance[j])
            {
                distance[j]=min+AdjacencyMatrix[p][j];
                for(int k=1; k<=sum; k++)
                    pre[j][k]=pre[p][k];
                for(int k=1; k<=sum; k++)
                    if(!pre[j][k])
                    {
                        pre[j][k]=j;
                        break;
                    }
            }
    }
    if(pre[e][1])
    {
        cout<<"the min distace between "<<cic[s].name<<" and "<<cic[e].name<<" is "<<distance[e]<<endl;
        cout<<"the path is :"<<endl;
        for(int k=1; k<=sum; k++)
        {
            if(!pre[e][k])
                break;
            cout<<cic[pre[e][k]].name<<" ";
        }
        cout<<endl;
    }
    else
        cout<<"no path between "<<cic[s].name<<" and "<<cic[e].name<<endl;
}

int main()
{
    map a;
    int n;
    do
    {
        system("cls");
        cout<<"********************************************************"<<endl;
        cout<<"*   welcome come to this xitong made by HanFangchong   *"<<endl;
        cout<<"*                                                      *"<<endl;
        cout<<"*      1-build node          2-build edge              *"<<endl;
        cout<<"*                                                      *"<<endl;
        cout<<"*      3-add node            4-add edge                *"<<endl;
        cout<<"*                                                      *"<<endl;
        cout<<"*      5-query node          6-query minpath           *"<<endl;
        cout<<"*                                                      *"<<endl;
        cout<<"*                    0-exit                            *"<<endl;
        cout<<"********************************************************"<<endl;
        printf("Selcet the operation you want:\n");
        cin>>n;
        switch(n)
        {
        case 1:
        {
            system("cls");
            a.InputNode();
            break;
        }
        case 2:
        {
            system("cls");
            a.BuildMap();
            break;
        }
        case 3:
        {
            system("cls");
            a.AddNode();
            break;
        }
        case 4:
        {
            system("cls");
            a.AddEdge();
            break;
        }
        case 5:
        {
            system("cls");
            a.QueryNode();
            int s;
            cout<<"exit-0"<<endl;
            cin>>s;
            if(!s)
                break;
        }
        case 6:
        {
            system("cls");
            a.Queryminpath();
            int s;
            cout<<"exit-0"<<endl;
            cin>>s;
            if(!s)
                break;
        }
        }
    }
    while(n);
    cout<<"thank for your using";
    return 0;
}


目录
相关文章
|
14天前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
40 15
|
20天前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
3月前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
107 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
8天前
|
人工智能 自然语言处理 供应链
从第十批算法备案通过名单中分析算法的属地占比、行业及应用情况
2025年3月12日,国家网信办公布第十批深度合成算法通过名单,共395款。主要分布在广东、北京、上海、浙江等地,占比超80%,涵盖智能对话、图像生成、文本生成等多行业。典型应用包括医疗、教育、金融等领域,如觅健医疗内容生成算法、匠邦AI智能生成合成算法等。服务角色以面向用户为主,技术趋势为多模态融合与垂直领域专业化。
|
6天前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
15天前
|
存储 人工智能 算法
通过Milvus内置Sparse-BM25算法进行全文检索并将混合检索应用于RAG系统
阿里云向量检索服务Milvus 2.5版本在全文检索、关键词匹配以及混合检索(Hybrid Search)方面实现了显著的增强,在多模态检索、RAG等多场景中检索结果能够兼顾召回率与精确性。本文将详细介绍如何利用 Milvus 2.5 版本实现这些功能,并阐述其在RAG 应用的 Retrieve 阶段的最佳实践。
通过Milvus内置Sparse-BM25算法进行全文检索并将混合检索应用于RAG系统
|
22天前
|
存储 缓存 监控
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
31 3
|
1月前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
56 12
|
1月前
|
算法 安全 网络安全
基于 Python 的布隆过滤器算法在内网行为管理中的应用探究
在复杂多变的网络环境中,内网行为管理至关重要。本文介绍布隆过滤器(Bloom Filter),一种高效的空间节省型概率数据结构,用于判断元素是否存在于集合中。通过多个哈希函数映射到位数组,实现快速访问控制。Python代码示例展示了如何构建和使用布隆过滤器,有效提升企业内网安全性和资源管理效率。
51 9
|
9天前
|
人工智能 自然语言处理 算法
从第九批深度合成备案通过公示名单分析算法备案属地、行业及应用领域占比
2024年12月20日,中央网信办公布第九批深度合成算法名单。分析显示,教育、智能对话、医疗健康和图像生成为核心应用领域。文本生成占比最高(57.56%),涵盖智能客服、法律咨询等;图像/视频生成次之(27.32%),应用于广告设计、影视制作等。北京、广东、浙江等地技术集中度高,多模态融合成未来重点。垂直行业如医疗、教育、金融加速引入AI,提升效率与用户体验。