好久没有看图论了,就从最短路算法开始了。

dijkstra算法的本质是贪心。只适用于不含负权的图中。因为出现负权的话,贪心会出错。

一般来说,我们用堆(优先队列)来优化,将它O(n2)的复杂度优化为O((m+n)logn)

模板链接

套用dijkstra模板即可。给出范例:

#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
int n,m,s,tot,head[500000];
struct edge{
int next,to,dis;
}e[500000];
inline void add(int x,int y,int w){
e[++tot].to=y;
e[tot].next=head[x];
e[tot].dis=w;
head[x]=tot;
}
int dis[300000];
bool vis[300000];
struct node{
int dis,pos;
bool operator <(const node&x)const{
return x.dis<dis;
}
};
priority_queue<node>q;
inline void dijkstra(){
dis[s]=0;
q.push((node){0,s});
while(!q.empty()){
node tmp=q.top();
q.pop();
int x=tmp.pos,d=tmp.dis;
if(vis[x])continue;
vis[x]=1;
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;
if(dis[y]>dis[x]+e[i].dis){
dis[y]=dis[x]+e[i].dis;
if(!vis[y])q.push((node){dis[y],y});
}
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=n;++i)dis[i]=2147483647;
for(int i=1;i<=m;++i){
register int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
dijkstra();
for(int i=1;i<=n;++i)printf("%d ",dis[i]);
return 0;
}

简单例题1:

仍旧是简单的dijkstra,求某一个点到任何一个点的最短路。

代码:

#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
int n,m,a,b,c,Ts,Te;
struct edge{
int next,to,dis;
}e[500000];
struct node{
int dis,pos;
bool operator <(const node&x)const{
return x.dis<dis;
}
};
int vis[50000],dis[50000];
int head[50000],tot;
priority_queue<node>q;
inline void add(int x,int y,int w){
e[++tot].to=y;
e[tot].next=head[x];
e[tot].dis=w;
head[x]=tot;
}
inline void dijkstra(){
dis[Ts]=0;
q.push((node){0,Ts});
while(!q.empty()){
node tmp=q.top();
q.pop();
int x=tmp.pos;
if(vis[x])continue;
vis[x]=1;
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;
if(dis[y]>dis[x]+e[i].dis){
dis[y]=dis[x]+e[i].dis;
if(!vis[y])q.push((node){dis[y],y});
}
}
}
}
int main(){
scanf("%d%d%d%d",&n,&m,&Ts,&Te);
for(int i=1;i<=n;++i)dis[i]=2147483647;
for(int i=1;i<=m;++i){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);add(b,a,c);
}
dijkstra();
printf("%d\n",dis[Te]);
return 0;
}

对于dijkstra最短路算法的复习的更多相关文章

  1. Dijkstra最短路算法

    Dijkstra最短路算法 --转自啊哈磊[坐在马桶上看算法]算法7:Dijkstra最短路算法 上节我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最 ...

  2. 【坐在马桶上看算法】算法7:Dijkstra最短路算法

           上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径 ...

  3. Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)

    上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&q ...

  4. 【啊哈!算法】算法7:Dijkstra最短路算法

    上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图 ...

  5. 如何在 Java 中实现 Dijkstra 最短路算法

    定义 最短路问题的定义为:设 \(G=(V,E)\) 为连通图,图中各边 \((v_i,v_j)\) 有权 \(l_{ij}\) (\(l_{ij}=\infty\) 表示 \(v_i,v_j\) 间 ...

  6. dijkstra 最短路算法

    最朴素的做法o(V*V/2+2E)~O(V^2)#include<iostream>using namespace std;#include<vector>#include&l ...

  7. python dijkstra 最短路算法示意代码

    def dijkstra(graph, from_node, to_node): q, seen = [(0, from_node, [])], set() while q: cost, node, ...

  8. dijkstra最短路算法(堆优化)

    这个算法不能处理负边情况,有负边,请转到Floyd算法或SPFA算法(SPFA不能处理负环,但能判断负环) SPFA(SLF优化):https://www.cnblogs.com/yifan0305/ ...

  9. 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法

    图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...

随机推荐

  1. Shader Graph

    About Shader Graph https://docs.unity3d.com/Packages/com.unity.shadergraph@7.3/manual/index.html uni ...

  2. 【转】Android 音量键+电源键 截屏代码小结

    http://104zz.iteye.com/blog/1752961 原文地址:http://blog.csdn.net/hk_256/article/details/7306590 ,转载请注明出 ...

  3. bootstrap-table存在合并单元格怎么处理数据

    效果如图: js文件如下: $(function () { initTable() $('#load_vip').change(function () { $ .ajax({ type: 'POST' ...

  4. 常用API【2】

    常用API 1.Math类 1.1 Math类概述 Math包含执行基本数字运算的方法 没有构造方法,如何使用类中的成员呢? 看类的成员是否是静态的,如果是,可以通过类名直接调用 1.2Math类的常 ...

  5. InnoDB 引擎中的索引类型

    首先索引是一种数据结构,并且索引不是越多越好.合理的索引可以提高存储引擎对数据的查询效率. 形象一点来说呢,索引跟书本的目录一样,能否快速的查找到你需要的信息,取决于你设计的目录是否合理. MySQL ...

  6. URL 去重的 6 种方案!(附详细实现代码)

    URL 去重在我们日常工作中和面试中很常遇到,比如这些: 可以看出,包括阿里,网易云.优酷.作业帮等知名互联网公司都出现过类似的面试题,而且和 URL 去重比较类似的,如 IP 黑/白名单判断等也经常 ...

  7. RocketMQ生产部署架构如何设计

    前言 看了我们之前的文章,相信小伙伴们对RocketMQ已经有了一个初步的了解,那么今天我们就来聊一聊具体如何来设计一套高可用的生产部署架构. 在聊如何设计这套架构的同时,我们再补充一些之前没提到的知 ...

  8. Cassandra Vnodes在Cassandra 2.0-4.0中的演进

    Vnodes简短历史 Vnodes又叫Virtual Nodes.是Cassandra在1.2版本里引入的功能,已经在生产环境中使用了近8年了.从2.0版本开始,因为默认配置里num_tokens一般 ...

  9. 菜鸟电子面单对接技术方案(link)

    一.背景 快递业务日新月异,收发快递是生活中不可缺少的一部分了,特别是做微商的商家,每天发送大量的快递.填写快递单已经成为过去式,快递小哥上门收件的时候,都使用手持的中端设备,再也不用客户填写快递单了 ...

  10. Linked List 单向链表

    Linked List 链表的理解 小结 链表是以节点的方式来储存的 每个节点包括 data域:存放数据,next域:指向下一个节点 如图:发现链表的各个节点不一定是连续储存的 链表分为带头节点的链表 ...