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

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

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

#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;
}
时间: 2024-10-18 06:46:17

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

C++用Dijkstra(迪杰斯特拉)算法求最短路径_C 语言

算法介绍 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低. 算法思想 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的集合(初始时只含有源点V0) (2)V-S=T:尚未确定的顶点集合 将T中顶点按递增

迪杰斯特拉算法介绍

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想      通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算).      此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离).      初始时,S中只有起点s:U中是除s之外的顶点

dijkstra-关于迪杰斯特拉算法的一个问题。

问题描述 关于迪杰斯特拉算法的一个问题. 麻烦帮忙看一下 这个代码里面核心算法那一块具体是怎么实现的啊,蒙逼了,研究半天没有思路.好像是有问题吧. 谢谢了 #include #include #include #include #define FIN "dijkstra.in" #define FOUT "dijkstra.out" #define oo ((1LL<<31)-1)//近似无限大 #define MAXN 50005 using name

算法研究:最短路径之迪杰斯特拉算法

对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点, 最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法.本文先来讲第一种, 从某个源点到其余各顶点的最短路径问题. 这是一个按路径长度递增的次序产生最短路径的算法,它的大致思路是 这样的. 比如说要求图7-7-3中顶点v0到v1的最短路径,显然就是1.由于顶点v1还与v2,v3,v4连线,所以此时我们 同时求得了v0->v1->v2 = 1+

C++用Dijkstra(迪杰斯特拉)求最短路径的算法解析

算法介绍 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959  年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低. 算法思想 按路径长度递增次序产生算法:  把顶点集合V分成两组:   (1)S:已求出的顶点的集合(初始时只含有源点V0)   (2)V-S=T:尚未确定的顶点集合  将

【算法小总结】迪杰斯特拉(Dijkstra)求最短路径

此图是有向无负权指的图(弱连通图)   假设求1到6的最短路径,用迪杰斯特拉(Dijkstra)算法如何求?   迪杰斯特拉算法像无权最短路径算法一样,按阶段进行.假设s是起点,在每个阶段,迪杰斯特拉算法选择离s最近的一个顶点v,在v所有未知顶点中选取它能达到的,距离它最短的x顶点的路径长度D,若D小于s到x的长度(若没有路就是无穷大),替换s到x的长度D',同时声明s到v的最短路径是已知的.   其实核心算法就是一个使用贪心选取法则填表的for循环 若是路径带价值,加上价值即可,在判断的时候当

既熟悉又陌生的“迪杰斯特拉”

       最近看一些专业课的书籍,在不同的书本上看到了Dijkstra(迪杰斯特拉)这个名字:可以毫不夸张地说,凡是学信息相关专业的学生都应该听说过他的名字(课堂上曾提到的"迪杰斯特拉算法"就是他提出来的,在考试中也经常遇到).但是,除了这个之外,大家对他的了解应该是很少的,所以,我认为他是我们"最熟悉的陌生人".对于这位"陌生人",我深感好奇,于是上网查找了一些有关这位计算机科学家的资料.在此,与大家分享,也算是对这位大师的贡献表示认可吧.

代码-有没有改进的迪杰斯特拉距离算法啊,搜了好久没发现有啊,急

问题描述 有没有改进的迪杰斯特拉距离算法啊,搜了好久没发现有啊,急 5C 就是在图论中求两点之间最短距离的DIJ算法,最好有改进的代码~用来解决路径优化问题 解决方案 如果说只是要按距离排序的话就没必要非要什么算法了就把两点之间形成的长方形的长+宽来排序即可 解决方案二: 可是问题是得知道所有得两两点之间的最短距离,你这属于遍历了啊,要是一万个节点的话,这样很浪费时间 解决方案三: Folyd算法,详情参见 算法导论

邻接矩阵prim:php实现图的邻接矩阵及普里姆(prim算法),弗洛伊德(floyd),迪杰斯特拉(dijkstra)算法

<?phprequire 'mgraph.php';$a = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i');$b = array('ab'=>'10', 'af'=>'11', 'bg'=>'16', 'fg'=>'17', 'bc'=>'18', 'bi'=>'12', 'ci'=>'8', 'cd'=>'22', 'di'=>'21', 'dg'=>'24', 'gh'=>'