Dijkstra算法 笔记与思路整理
该文章可能存在硬伤与不妥,不能作为教程阅读。(因为我真的鶸
Dij作为单源最短路算法,需要先确定一个起点。Dij的函数主体为维护每个节点的dis和vis两个变量。dis表示该点距离起点的最短路权值和,vis存储该点是否被访问过。
设点数为n,无向边数为m,则要进行n次循环,每次循环中找出一个dis最小且vis不为真的点进行松弛操作。
这里抄一段百科:
松弛操作是指对于每个顶点v∈V,都设置一个属性g[v],用来描述从源点s到v的最短路径上权值的上界,称为最短路径估计(shortest-path estimate)。
松弛操作主要代码:
if(dis[g[i].to] > g[i].val + curr.dis)
dis[g[i].to] = g[i].val + curr.dis;
然后就是优化:
(1)判断最小值的循环可用优先队列优化
(2)使用优先队列后可以直接判断堆中是否剩余元素来循环
(3)使用链表存储图,松弛操作只遍历相关的边
模板:
#include <bits/stdc++.h>
#define maxn 10010
#define maxm 10010
using namespace std; struct edge{
int to, val, next;
};
edge g[maxm];
int first[maxn], edge_cnt = ; struct node{
int pos, dis;
};
priority_queue<node> q;
bool operator<(const node a, const node b){
return a.dis > b.dis;
}
int dis[maxn], vis[maxn]; int n, m;
void in_put(){
scanf("%d%d", &n, &m); //n nodes, m edges
for(int i=; i<m; i++){
int f, t, val;
scanf("%d%d%d", &f, &val, &t);
g[edge_cnt] = (edge){t, val, };
g[edge_cnt].next = first[f];
first[f] = edge_cnt;
edge_cnt ++;
}
}
void dijkstra(int start){
vis[start] = ;
dis[start] = ;
q.push((node){start, dis[start]});
while(q.size()){
node curr = q.top();
q.pop();
int from = curr.pos;
for(int i = first[from]; i ; i = g[i].next){
if(dis[g[i].to] > g[i].val + curr.dis){
dis[g[i].to] = g[i].val + curr.dis;
q.push((node){g[i].to, dis[g[i].to]});
}
}
} }
int main(){
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
memset(dis, 0x3f, sizeof(dis));
in_put();
dijkstra();
return ;
}
Dijkstra算法 笔记与思路整理的更多相关文章
- Kruskal算法求最小生成树 笔记与思路整理
整理一下前一段时间的最小生成树的算法.(其实是刚弄明白 Kruskal其实算是一种贪心算法.先将边按权值排序,每次选一条没选过的权值最小边加入树,若加入后成环就跳过. 先贴张图做个示例. (可视化均来 ...
- st表、树状数组与线段树 笔记与思路整理
已更新(2/3):st表.树状数组 st表.树状数组与线段树是三种比较高级的数据结构,大多数操作时间复杂度为O(log n),用来处理一些RMQ问题或类似的数列区间处理问题. 一.ST表(Sparse ...
- Dijkstra算法图文详解
Dijkstra算法 Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不 ...
- 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径
自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...
- 算法笔记_068:Dijkstra算法简单介绍(Java)
目录 1 问题描述 2 解决方案 2.1 使用Dijkstra算法得到最短距离示例 2.2 具体编码 1 问题描述 何为Dijkstra算法? Dijkstra算法功能:给出加权连通图中一个顶点, ...
- 图的最短路径-----------Dijkstra算法详解(TjuOj2870_The Kth City)
做OJ需要用到搜索最短路径的题,于是整理了一下关于图的搜索算法: 图的搜索大致有三种比较常用的算法: 迪杰斯特拉算法(Dijkstra算法) 弗洛伊德算法(Floyd算法) SPFA算法 Dijkst ...
- NAND FLASH均衡算法笔记(转)
转来一篇关于NAND FLASH均衡算法的文章,加上一点思考和笔记,认为这种思考有助于更深刻的理解,更好的记忆,所以也算半原创了吧,最起码笔记是原创的.有意思的是,帖子提起这个算法并不是因为嵌入式开发 ...
- 【转】Dijkstra算法(单源最短路径)
原文:http://www.cnblogs.com/dolphin0520/archive/2011/08/26/2155202.html 单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路 ...
- HDU1535——Invitation Cards(最短路径:SPAF算法+dijkstra算法)
Invitation Cards DescriptionIn the age of television, not many people attend theater performances. A ...
随机推荐
- 基于SpringBoot+WebSocket搭建一个简单的多人聊天系统
前言 今天闲来无事,就来了解一下WebSocket协议.来简单了解一下吧. WebSocket是什么 首先了解一下WebSocket是什么?WebSocket是一种在单个TCP连接上进行全双工 ...
- ORM查询总结版
目录 概要 ORM常用字段 ORM基础 自定义一个插入类型,即固定长度 创建类终极版 多对多关系表创建 常用几个代码 参数 ORM与数据库代码对应的关系 外键使用分表很麻烦,要先删除主表后,再删除 不 ...
- Spring Boot (十五): 优雅的使用 API 文档工具 Swagger2
1. 引言 各位在开发的过程中肯定遇到过被接口文档折磨的经历,由于 RESTful 接口的轻量化以及低耦合性,我们在修改接口后文档更新不及时,导致接口的调用方(无论是前端还是后端)经常抱怨接口与文档不 ...
- aiohttp的安装
之前介绍的requests库是一个阻塞式HTTP请求库,当我们发出一个请求后,程序会一直等待服务器响应,知道得到响应后,程序才会进行下一步处理.其实,这个过程比较耗时.如果程序可以在这个等待过程中做一 ...
- Faith 信念
Today I’d like to talk about faith. With faith, you’ll go further and never be lost. Faith is free a ...
- Neo4j:图数据库GraphDB(一)入门和基本查询语句
图数据库的代表:Neo4j 官网: http://neo4j.com/ 引言:为什么使用图数据库 在很多新型项目中,应用图数据库已经是势在必行的趋势了,因为图数据库可以很好的表示各种节点与关系的概念 ...
- openssl之DH(Diffie–Hellman)加密
//加密机制初始化 g_HDMgr.init(); //对方的public key BIGNUM* peerPubKey = NULL; peerPubKey = BN_bin2bn((unsigne ...
- vue css 深度选择器
在我们想穿透的选择器前边添加 >>> 或者 /deep/ 或者 ::v-deep. 官方地址:https://vue-loader.vuejs.org/guide/scoped-cs ...
- 如何通过 Docker 部署 Logstash 同步 Mysql 数据库数据到 ElasticSearch
在开发过程中,我们经常会遇到对业务数据进行模糊搜索的需求,例如电商网站对于商品的搜索,以及内容网站对于内容的关键字检索等等.对于这些高级的搜索功能,显然数据库的 Like 是不合适的,通常我们采用 E ...
- Bootstrap应用核心
Bootstrap是当前世界最受欢迎的响应式.移动设备优先的门户和应用前端框架.它不是单一的CSS或JavaScript框架,而是完整的HTML.CSS.JavaScript框架,你可以仅通过Boot ...