Dijkstra算法——超~~详细!!

Dijkstra算法
_ ** 时隔多月,我又回来了!**_
今天下午久违的又学了会儿算法,又重新学习了一遍Dijkstra,这是第三次重新学习Dijkstra(*以前学的都忘完了>_<*).
废话先不bb,上代码。

#include<bits/stdc++.h>
using namespace std;
#define INF 9999999
#define M 1000
int d[M];
int p[M]={0};
int con[M][M];
int n,line;           //n点数,边数line 

struct node{
    char name;
}w[M];
void Dijkstra(int v,int *d,int p[],int con[M][M]) //初始点v
{
    int vis[M];
    for(int i=1;i<=n;i++)        //第一步,确定与初始点v连接的点的路径
    {
        d[i]=con[v][i];
        vis[i]=0;               //vis初始化
        if(d[i]!=INF)
        p[i]=v;
    }
    d[v]=0;                     //对第一个点初始化
    vis[v]=1;
    for(int i=1;i<=n;i++)       //第二布,两重循环 ,每次循环又分两步 。判断所有点
    {
        int a=INF,id=v;
        for(int j=1;j<=n;j++) //1、找出该次循环中距离最小的点, 该点可能是一条新的路径
        {
            if(d[j]<a && !vis[j])
            {
                a=d[j];       //a确定值
                id=j;         //id确定点的下标
            }
        }
        vis[id]=1;              //已判断过 ,已经走过
        for(int j=1;j<=n;j++)   //2、 从此时距离最短的点出发,更新与id相连的点的值,有两种情况
        {
            if(!vis[j] && con[id][j]<INF)
            {
                int newdis=d[id]+con[id][j];
                if(newdis<d[j])         //根据 newdis与d[j]判断
                {
                    d[j]=newdis;
                    p[j]=id;
                }
            }
        }
    }
}
int idex(char a)
{
    for(int i=1;i<M;i++)
        if(w[i].name==a)
            return i;
}
void fun(int *p,char fist,char last)
{
    char x[M];
    int f=idex(fist),l=idex(last);
    cout<<"从"<<fist<<"到"<<last<<"的最短路径为:\n";
    x[0]=last;
    int y=1;
    int t=p[l];
    while(t!=f)
    {
        x[y++]=w[t].name;
        t=p[t];
    }
    cout<<fist;
    for(int i=y-1;i>=0;i--)
    cout<<"->"<<x[i];
    cout<<"\n";
}
int main()
{
    char a,b;
    int dis;
    cout << "************算法6.10 迪杰斯特拉算法**************\n";
    cout<<"请输入总点数,总边数:";
    cin>>n>>line;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            con[i][j]=INF;
    for(int i=1;i<=n;i++)
    {
        cout<<"请输入第"<<i<<"个点:";
        cin>>w[i].name;
    }
    for(int i=1;i<=line;i++)
    {
        cout<<"请输入第"<<i<<"条边:";
        cin>>a>>b>>dis;
        int a1=idex(a),b1=idex(b);
        if(dis<INF)
        {
            con[a1][b1]=dis;
            con[b1][a1]=dis;
        }
    }

    cout << "*****无向网G创建完成!*****\n" ;
    for(int i=1;i<=n;i++)
        d[i]=INF;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(con[i][j]==INF)
            cout<<"∞ ";
            else
            cout<<con[i][j]<<" ";
        }
        printf("\n");
    }
    cout<<"请输入起点和终点:";
    cin>>a>>b;
    Dijkstra(idex(a), d, p, con);
    cout << a<<"到最后"<<b<<"的最短路径长度为: " << d[idex(b)] <<"\n";
    fun(p,a,b);
    return 0;
} 

 

这次学习总结了Dijkstra算法模板函数的几个主要步骤,因为这个函数没有用到递归,只
用了两个循环,因此可以分为从上到下的两步。
Dijkstra算法模板函数主要有两步:
一、
确定与初始点v连接的点的路径 ,检查所有与初始点连接的点并更新他们的d[i]值。
二、
一个二重嵌套循环,每次for循环里又分两步:
1、
找出此次循环中(d[i]中)距离值最小的,并分别用id,a记录该点对应的下标与d[i].
2、
以这个点(id)为初始点,更新所有与该点相连通的点(d数组).
重复第二步。
**以上。**

原文地址:https://www.cnblogs.com/zjydeoneday/p/11980241.html

时间: 2024-10-14 17:52:59

Dijkstra算法——超~~详细!!的相关文章

【优化算法】Greedy Randomized Adaptive Search算法 超详细解析,附代码实现TSP问题求解

01 概述 Greedy Randomized Adaptive Search,贪婪随机自适应搜索(GRAS),是组合优化问题中的多起点元启发式算法,在算法的每次迭代中,主要由两个阶段组成:构造(construction)和局部搜索( local search). 构造(construction)阶段主要用于生成一个可行解,而后该初始可行解会被放进局部搜索进行邻域搜索,直到找到一个局部最优解为止. 02 整体框架 如上面所说,其实整一个算法的框架相对于其他算法来说还算比较简单明了,大家可以先看以

【智能算法】粒子群算法(Particle Swarm Optimization)超详细解析+入门代码实例讲解

喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 算法起源 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 .该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型.粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解.

算法核心——空间复杂度和时间复杂度超详细解析

算法核心——空间复杂度和时间复杂度超详细解析 一.什么是算法 算法: 一个有限指令集 接受一些输入(有些情况下不需要收入) 产生输出 一定在有限步骤之后终止 每一条指令必须: 有充分明确的目标,不可以有歧义 计算机能处理的范围之内 描述应不依赖于任何一种计算机语言以及具体的实现手段 其实说白了,算法就是一个计算过程解决问题的方法.我们现在已经知道数据结构表示数据是怎么存储的,而“程序=数据结构+算法”,数据结构是静态的,算法是动态的,它们加起来就是程序. 对算法来说有输入,有输出,相当于函数有参

Dijkstra算法详细(单源最短路径算法)

介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或许,你曾经感觉它很难,那么,这个时候正适合你重新认识它. Dijkstra能是干啥的? Dijkstra是用来求单源最短路径的 就拿上图来说,假如直到的路径和长度已知,那么可以使用dijkstra算法计算南京到图中所有节点的最短距离. 单源什么意思? 从一个顶点出发,Dijkstra算法只能求一个顶

Dijkstra算法求单源最短路径

1.最短路径 在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同.如果是一个带权图,那么路径长度为路径上各边的权值的总和.两个顶点间路径长度最短的那条路径称为两个顶点间的最短路径,其路径长度称为最短路径长度. 最短路径在实际中有重要的应用价值.如用顶点表示城市,边表示两城市之间的道路,边上的权值表示两城市之间的距离.那么城市A到城市B连通的情况下,哪条路径距离最短呢,这样的问题可以归结为最短路径问题. 求最短路径常见的算法有Dijkstra算法和Floyd算法

Java数据结构 最短路径解法Dijkstra算法

本文为博主原创文章,未经博主允许不得转载! 1.1.定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(

最短路径-Dijkstra算法(转载)

注意:以下代码 只是描述思路,没有测试过!! Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到

有向有权图的最短路径算法--Dijkstra算法

Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法, 在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径) 2.算

最短路径—Dijkstra算法

Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径) 2.算法