Dijkstra算法 笔记与思路整理
2024-09-01 16:18:51
该文章可能存在硬伤与不妥,不能作为教程阅读。(因为我真的鶸
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 ;
}
最新文章
- 旧文备份:CANopen协议PDO的几种传输方式
- 转载:Solr的自动完成实现方式(第二部分:Suggester方式)
- js展开一颗树
- BZOJ4046 [Cerc2014] Pork barre
- context menu与submenu区别
- AStar算法(转载)
- 学会查看tomcat的日志文件
- 如何使用编辑模板在ASPxGridView中进行新增修改(除去常规的gridviw模板编辑外)
- javascirpt历史澄清误解基本概念特点编程语言web2.0网页javascript - javascirpt知识大全
- emWin(ucGui)的Edit控件退格处理方法 worldsing
- JavaScript实现搜索联想功能
- show
- java 自定义注解以及获得注解的值
- 数据收集程序一般建筑(C++ ACE达到)
- 用html+css+js做打地鼠小游戏
- file_get_contents函数不能使用的解决方法
- Gulp 之图片压缩合并
- spring 事物不回滚
- 关于使用MUI框架ashx获取值的问题
- C#修饰符详解
热门文章
- [Python] Python 学习记录(1)
- 软件开发工具(第7章:Eclipse入门)
- [以太坊源代码分析] I.区块和交易,合约和虚拟机
- 设计模式---结构型模式之适配器模式(Adapter Pattern)
- Java读源码之LockSupport
- SQL SERVER数据库日常使用总结
- CSS定位机制:浮动 float及清除浮动的常用方法
- ZGC gc策略及回收过程-源码分析
- 【Java 基础】谈谈集合.List
- 宝塔面板6.x版本前台存储XSS+后台CSRF组合拳Getshell