【最短路径之dijkstra(迪杰斯特拉)算法】
这一章主要介绍最短路径的算法之一,dijkstra算法。
概念 :迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
类比!!!
迪杰斯特拉算法其实和这个算法非常类似!
唯一不同的是,在Prim中,我们dst[i]的值只包含了自己的最小边权,但是在Dijkstra中,dst[i]的值为自己的最小边权+上一层的最小边权。代码形式展现:
Prim算法:
int v=g[lasti][j].v,w=g[lasti][j].w;
if(!s[v]&&w+dst[lasti]<dst[v])
{
pre[v]=lasti;
dst[v]=w;
}
Dijkstra算法:
int v=g[lasti][j].v,w=g[lasti][j].w;
if(!s[v]&&w+dst[lasti]<dst[v])
{
pre[v]=lasti;
dst[v]=w+dst[lasti];
}
就多了一个新的元素加入计算而已!
接下来分析思路。
输入之后对边权值进行排序,然后按边权值从小到大进行合并(merge)操作,如果操作成功(被合并的两个点不在一棵树上),则把这两个顶点的边权值加入总数,最后输出total即可。
主要使用:
“并查集。”
在输入的时候,我们就要用一个结构体存起来方便后续操作。输入完之后按边权值从小到大进行合并,如果要合并的两个点不在同一棵树上,那么记为合并成功-》总数加上这两个点的边权值即可。
最后输出就可以了。
特别注意:最好记录一下pre[i]即谁最终连向点i(最优的那个)方便部分题目的完成。
PS。如果上面的看不懂的去看这篇博客,有画图等详细解说。都是类似的哈。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int dst[5010];
int n,m;
bool s[5010];
int pre[5010];
struct node
{
int v,w;
node(){}
node(int vv,int ww)
{
v=vv,w=ww;
}
};
vector<node> g[5010];
void init()
{
for(int i=1;i<=5000;i++)
{
dst[i]=0x7f7f7f7f;
}
}
int main()
{
init();
int a,b,c;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>a>>b>>c;
g[a].push_back(node(b,c));
g[b].push_back(node(a,c));
}
s[1]=1;
dst[1]=0;
int lasti=1;
for(int k=1;k<n;k++)
{
for(int j=0;j<g[lasti].size();j++)
{
int v=g[lasti][j].v,w=g[lasti][j].w;
if(!s[v]&&w+dst[lasti]<dst[v])
{
pre[v]=lasti;
dst[v]=w+dst[lasti];
}
}
int min_i=0x7f7f7f7f,min_dst=0x7f7f7f7f;
for(int i=1;i<=n;i++)
{
if(!s[i])
{
if(dst[i]<min_dst)
{
min_dst=dst[i];
min_i=i;
}
}
}
lasti=min_i;
s[min_i]=1;
//printf("更新点%d加入,父节点%d\n",lasti,pre[lasti]);
}
cout<<dst[n]<<endl;
return 0;
}
ov.
【最短路径之dijkstra(迪杰斯特拉)算法】的更多相关文章
- c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法
c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...
- (Dijkstra)迪杰斯特拉算法-最短路径算法
迪杰斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想:设G=(V,E)是一个带权有向图 ...
- 图解Dijkstra(迪杰斯特拉)算法+代码实现
简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的 ...
- Dijkstra(迪杰斯特拉)算法求解最短路径
过程 首先需要记录每个点到原点的距离,这个距离会在每一轮遍历的过程中刷新.每一个节点到原点的最短路径是其上一个节点(前驱节点)到原点的最短路径加上前驱节点到该节点的距离.以这个原则,经过N轮计算就能得 ...
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
Dijkstra算法 ———————————最后更新时间:2011.9.25———————————Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径. ...
- 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)
文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...
- 算法-迪杰斯特拉算法(dijkstra)-最短路径
迪杰斯特拉算法(dijkstra)-最短路径 简介: 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中 ...
- C# 迪杰斯特拉算法 Dijkstra
什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...
- 图-最短路径-Dijktra(迪杰斯特拉)算法
1. 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉算法于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始 ...
- Dijkstra【迪杰斯特拉算法】
有关最短路径的最后一个算法——Dijkstra 迪杰斯特拉算法是由荷兰计算机科学家迪杰斯特拉于1959 年提出的,因此又叫迪杰斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...
随机推荐
- mysql三种修改密码的方式
[root@MySQL ~]# mysqladmin -uroot -proot -S /data/3307/mysql.sock password '123'; 其中-p是现在的密码,passwor ...
- Devart Blog
How to combine data from several sources using SQL and VirtualQueryhttp://blog.devart.com/how-to-com ...
- ef调用 access
<add name="AccessConnection" connectionString="Provider=Microsoft.ACE.OleDb.12.0;D ...
- 修改Maven的本地仓库地址
已经配置好的设定文件: 1.创建一个本地仓库的地址 2.修改Maven中conf目录下的settings.xml文件 在此处添加修改后的本地仓库的地址 3.打开cmd 输入mvn help:sys ...
- 数据管理工具Flux、Redux、Vuex的区别
目录 为什么要进行数据管理? 怎么有效地进行数据管理? 数据管理工具 1. Flux 2. Redux 3. Vuex 使用数据管理工具的场景 相关资料 主要讲解一下前端为什么需要进行数据管理,有效的 ...
- Spring5源码深度分析(二)之理解@Conditional,@Import注解
代码地址: 1.源码分析二主要分析的内容 1.使用@Condition多条件注册bean对象2.@Import注解快速注入第三方bean对象3.@EnableXXXX 开启原理4.基于ImportBe ...
- .NET架构师知识普及
今天看到一篇漫画,[3年.NET开发应聘大厂惨遭淘汰,如何翻身打脸面试官?],好多问题,一下子还真的回答不了,这里对这些问题进行了整理,增加下脑容量,哈哈.俗话说不想当将军的士兵不是好士兵,不想当架构 ...
- 系统学习 Java IO ---- 目录,概览
Java IO 类的系统教程,原创.主要参考自英文教程 Java IO Tutorial 和 Java Doc. http://tutorials.jenkov.com/java-io/index.h ...
- java - Builder模式实例化对象
Builder 优雅的链式调用来实现实例化对象 1. 首先在实体类中,构造一个Builder内部类,由Builder来完成Person的属性赋值,并最终执行build来完成Person的实例化 pa ...
- redis在asp.net 中的应用
1.redis介绍 Nosql数据库作为关系型数据库的补充,在互联网公司已经得到广泛的运用.redis便是其中的代表之一,redis是一种(key,value)基于内存的数据库,并支持多种数据结构,如 ...