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

简介:

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

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


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


目录
相关文章
|
18天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
36 3
|
24天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的优化算法及其应用
【10月更文挑战第8天】 本文将探讨深度学习中常用的优化算法,包括梯度下降法、Adam和RMSProp等,介绍这些算法的基本原理与应用场景。通过实例分析,帮助读者更好地理解和应用这些优化算法,提高深度学习模型的训练效率与性能。
121 63
|
1天前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
5 0
|
12天前
|
存储 算法 搜索推荐
这些算法在实际应用中有哪些具体案例呢
【10月更文挑战第19天】这些算法在实际应用中有哪些具体案例呢
22 1
|
18天前
|
机器学习/深度学习 人工智能 算法
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
52 0
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
|
27天前
|
算法 安全 物联网
如何应用SM2算法进行身份认证
【10月更文挑战第5天】如何应用SM2算法进行身份认证
43 1
|
27天前
|
存储 算法 安全
SM2算法的应用场景有哪些?
【10月更文挑战第5天】SM2算法的应用场景有哪些?
52 1
|
30天前
|
存储 算法 安全
Python 加密算法详解与应用
Python 加密算法详解与应用
19 1
|
1月前
|
机器学习/深度学习 算法
深度学习中的优化算法及其应用
本文探讨了深度学习中常用的优化算法,包括梯度下降、随机梯度下降、动量方法和Adam方法。通过对比这些算法的优缺点及适用场景,帮助读者更好地理解和应用这些优化方法。
25 2
|
12天前
|
监控 算法 数据挖掘
HyperLogLog算法有哪些应用场景呢
【10月更文挑战第19天】HyperLogLog算法有哪些应用场景呢
11 0