该文章可能存在硬伤与不妥,不能作为教程阅读。(因为我真的鶸

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 ;
}

最新文章

  1. 旧文备份:CANopen协议PDO的几种传输方式
  2. 转载:Solr的自动完成实现方式(第二部分:Suggester方式)
  3. js展开一颗树
  4. BZOJ4046 [Cerc2014] Pork barre
  5. context menu与submenu区别
  6. AStar算法(转载)
  7. 学会查看tomcat的日志文件
  8. 如何使用编辑模板在ASPxGridView中进行新增修改(除去常规的gridviw模板编辑外)
  9. javascirpt历史澄清误解基本概念特点编程语言web2.0网页javascript - javascirpt知识大全
  10. emWin(ucGui)的Edit控件退格处理方法 worldsing
  11. JavaScript实现搜索联想功能
  12. show
  13. java 自定义注解以及获得注解的值
  14. 数据收集程序一般建筑(C++ ACE达到)
  15. 用html+css+js做打地鼠小游戏
  16. file_get_contents函数不能使用的解决方法
  17. Gulp 之图片压缩合并
  18. spring 事物不回滚
  19. 关于使用MUI框架ashx获取值的问题
  20. C#修饰符详解

热门文章

  1. [Python] Python 学习记录(1)
  2. 软件开发工具(第7章:Eclipse入门)
  3. [以太坊源代码分析] I.区块和交易,合约和虚拟机
  4. 设计模式---结构型模式之适配器模式(Adapter Pattern)
  5. Java读源码之LockSupport
  6. SQL SERVER数据库日常使用总结
  7. CSS定位机制:浮动 float及清除浮动的常用方法
  8. ZGC gc策略及回收过程-源码分析
  9. 【Java 基础】谈谈集合.List
  10. 宝塔面板6.x版本前台存储XSS+后台CSRF组合拳Getshell