【最短路算法】Dijkstra知识点&代码
代码:
#include<iostream>
#include<vector>
#include<cstdio>
#include<queue>
#include<map>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<set>
#include<cstring>
using namespace std;
typedef long long ll;
const ll INF=;
const int MM=;
const int NM=;
int n,m,s;//点,边,起始
int dis[NM];//最小距离
bool book[NM];//记录有没有作为顶点搜索过
//链式向前星
struct NODE{
int to;
int nxt;
int c;
}node[MM];//链式向前星
int head[NM],lcnt=;
void add(int a,int b,int c){
node[lcnt].to=b;
node[lcnt].c=c;
node[lcnt].nxt=head[a];
head[a]=lcnt++;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie();
cin>>n>>m>>s;
for(int i=;i<=n;i++){
dis[i]=INF;
}
for(int i=;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
//if(a==b)
// continue; add(a,b,c);
//add(b,a,c);
}
for(int i=head[s];i;i=node[i].nxt){ //从起始点开始枚举
int idx=node[i].to;
dis[idx]=min(node[i].c,dis[idx]); //更新最短路 }
dis[s]=; //自身距离为0
book[s]=; //标记搜索过
for(int kkk=;kkk<n;kkk++){ //枚举每个点(用编号)
int minn=INF,u=;
for(int i=;i<=n;i++){
if(!book[i]&&dis[i]<minn){
u=i; //枚举每个已经被标记了但是没有被搜索过的点
minn=dis[i]; //找距离最小的
}
} /*for(int i=1;i<=n;i++){
if(mp[u][i]<INF){
dis[i]=min(dis[i],dis[u]+mp[u][i]);
}
}*/ for(int i=head[u];i;i=node[i].nxt){
int idx=node[i].to; //正在搜索的点开始,枚举每一条边 dis[idx]=min(dis[idx],dis[u]+node[i].c); //更新最短距离,设f[i][j]为i到j的最大距离,d[i]为起始点到i的距离
//得到 d[j]=min(d[j],d[i]+f[i][j])
} book[u]=; //标记这个点搜索过了 }
for(int i=;i<=n;i++){
cout<<dis[i]<<" ";
}
return ;
}
查看神奇代码
1.储存方式:
链式向前星>> https://www.cnblogs.com/dudujerry/p/9915713.html
int n,m,s;//点,边,起始
int dis[NM];//最小距离
bool book[NM];//记录有没有作为顶点搜索过
//链式向前星
struct NODE{
int to;
int nxt;
int c;
}node[MM];//链式向前星
int head[NM],lcnt=1;
void add(int a,int b,int c){
node[lcnt].to=b;
node[lcnt].c=c;
node[lcnt].nxt=head[a];
head[a]=lcnt++;
}
2.更新所有与根节点连接的最短路
for(int i=head[s];i;i=node[i].nxt){ //枚举所有与起点连接的边
int idx=node[i].to;
dis[idx]=min(node[i].c,dis[idx]); //更新最短路 }
dis[s]=0; //自身距离为0
book[s]=1; //标记搜索过
使用book记录是否作为过用来更新的点, 则搜完之后 book[s]=1
3.接下来枚举除源点外所有点来作为用来更新最短路的点
依 ”从上次求出最短路的点中选出最短路最小的点“ 的顺序遍历除源点以外的n-1个点
for(int kkk=1;kkk<n;kkk++){ //枚举n-1次,因为原点已经被用来更新过了
int minn=INF,u=0;
for(int i=1;i<=n;i++){
if(!book[i]&&dis[i]<minn){ //枚举每个已经被标记了但是没有被搜索过的点
u=i;
minn=dis[i]; //找距离最小的
}
}
. . .
4.从选出的点开始更新所有与它连接的边
设已知 源点到i点的距离dis[i] 和 点i到点j的距离f[i][j] (未知当前dis [ j ]是否正确)
可以得到 dis [ j ] = min ( dis [ j ] , dis [ i ] + f [ i ] [ j ] )
根据上面的方程可以遍历所有与选出的点,算出最短路
. . .
for(int i=head[u];i;i=node[i].nxt){
int idx=node[i].to; //正在搜索的点开始,枚举每一条边 dis[idx]=min(dis[idx],dis[u]+node[i].c); //更新最短距离,设f[i][j]为i到j的最大距离,d[i]为起始点到i的距离
//得到 d[j]=min(d[j],d[i]+f[i][j])
} book[u]=1; //标记这个点搜索过了 }
5.输出
dis [ i ]就是源点到i点的距离
for(int i=1;i<=n;i++){
cout<<dis[i]<<" ";
}
【最短路算法】Dijkstra知识点&代码的更多相关文章
- (转)最短路算法--Dijkstra算法
转自:http://blog.51cto.com/ahalei/1387799 上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短 ...
- 最短路算法 Dijkstra 入门
dijkstra算法 是一种单源点最短路算法求出一个点到其他所有点的最短路. 给你这样的一个图,需要求出1号点到其他点的最短距离是多少. 首先我们开一个数组 d[N],d[x] 代表着从起点出发到x点 ...
- 10行实现最短路算法——Dijkstra
今天是算法数据结构专题的第34篇文章,我们来继续聊聊最短路算法. 在上一篇文章当中我们讲解了bellman-ford算法和spfa算法,其中spfa算法是我个人比较常用的算法,比赛当中几乎没有用过其他 ...
- 图的最短路算法 Dijkstra及其优化
单源最短路径算法 时间复杂度O(N2) 优化后时间复杂度为O(MlogN)(M为图中的边数 所以对于稀疏图来说优化后更快) 不支持有负权的图 #include<iostream> usin ...
- 最短路算法 —— Dijkstra算法
用途: 解决单源最短路径问题(已固定一个起点,求它到其他所有点的最短路问题) 算法核心(广搜): (1)确定的与起点相邻的点的最短距离,再根据已确定最短距离的点更新其他与之相邻的点的最短距离. (2) ...
- Dijkstra最短路算法
Dijkstra最短路算法 --转自啊哈磊[坐在马桶上看算法]算法7:Dijkstra最短路算法 上节我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最 ...
- 【啊哈!算法】算法7:Dijkstra最短路算法
上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图 ...
- 【最短路算法】Dijkstra+heap和SPFA的区别
单源最短路问题(SSSP)常用的算法有Dijkstra,Bellman-Ford,这两个算法进行优化,就有了Dijkstra+heap.SPFA(Shortest Path Faster Algori ...
- 【坐在马桶上看算法】算法7:Dijkstra最短路算法
上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径 ...
随机推荐
- SSH Secure Shell Client连接centos6.5时中文字乱码处理
在学习Linux的过程中,最先碰到的是通过SSH终端连接时发现有乱码出现,使用这篇文章先从这里说起. 在 ssh , telnet 终端中文显示乱码解决办法#vim /etc/sysconfig/i1 ...
- 使用 RxJava 的正确姿势
最近在使用 RxJava 时遇到了一些比较诡异的问题,排查的过程中做了点研究,发现平时大家的用法多多少少都有些问题.有些地方存在隐患,有些用法不够简练,我把这些问题简单做一下分类和总结,供大家参考. ...
- Java jre7及以上版本中的switch支持String的实现细节
Java7中的switch支持String的实现细节 作者: zsxwing 更新: 2013-03-04 21:08:02 发布: 2012-04-26 13:58:19 在Java7之前,swit ...
- java网络
title: java 网络 date: 2017年3月11日11:14:52 1. 复杂的东西就把他封装成对象 概述:(网络就是找到别人) 找到对方的机器,(找到对方的ip地址) 每个机器中有很多进 ...
- 【sqli-labs】 less53 GET -Blind based -Order By Clause -String -Stacked injection(GET型基于盲注的字符型Order By从句堆叠注入)
http://192.168.136.128/sqli-labs-master/Less-53/?sort=1';insert into users(id,username,password) val ...
- sql日期提取
--插入数据修改不行:必须提供学号 insert into Student(生日类型) values('阳历') --把月份提取出来 显示两位数 select DATENAME(month,getda ...
- 字符串str
字符串: #字符串的索引从0开始的,如果倒数最后一位是-1,索引的位置是唯一的.var1 = var[0:2] #从第一个字符到第2个字符var2 = var[:] #从第一个到最后var3 = va ...
- docker安装后出现Cannot connect to the Docker daemon
启动docker service docker start docker安装后出现Cannot connect to the Docker daemon You need to add user in ...
- Xilinx FPGA的专用时钟引脚及时钟资源相关
主要参考了https://www.eefocus.com/liu1teng/blog/12-02/237897_4533d.html .Xilinx UG471.UG472以及Xilinx Forum ...
- C语言中的DEBUG
#cat aa.c #include <stdio.h> #include <stdarg.h> #include <stdlib.h> #include < ...