在NOIP比赛中,如果出图论题最短路径应该是个常考点。

求解最短路径常用的算法有:Floyed算法(O(n^3)的暴力算法,在比赛中大概能过三十分)

dijkstra算法 (堆优化之后是O(MlogE),再加些玄学优化一般就是正解了,100分做法)

SPFA算法  ( 个人是不建议学习的,在NOIP提高组中出题人是故卡SPFA,它的复杂度是不确定的,它是基于ballman-Fold算法(O(N*E))的队列优化版)

这个应该都是比较简单的,直接上代码吧

dijkstra

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define MAXN 500010
using namespace std;
int cnt,n,m,s;
int head[MAXN];
int d[MAXN]; struct Edge{
int s,t,w,next;
}edge[500010]; void add(int u,int v,int wi){
cnt++;
edge[cnt].s=u;
edge[cnt].t=v;
edge[cnt].w=wi;
edge[cnt].next=head[u];
head[u]=cnt;
} struct HeapNode{
int pos,dis;
bool operator < ( const HeapNode &a )const {
return a.dis<dis;
}
}; void dijkstra(){
priority_queue <HeapNode> Q;
for(int i=1;i<=n;i++) d[i]=2147483647;
d[s]=0;
Q.push((HeapNode){s,0});
while(!Q.empty()){
while(Q.size() > 1 && Q.top().dis != d[Q.top().pos]) Q.pop();
HeapNode tmp=Q.top();
Q.pop();
int u=tmp.pos;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].t;
int wi=edge[i].w;
if(d[v]>d[u]+wi){
d[v]=d[u]+wi,
Q.push((HeapNode) {v,d[v]});
}
}
} } int main(){ scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++){
int x,y,z; scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
dijkstra();
for(int i=1;i<=n;i++){
printf("%d ",d[i]);
} return 0;
}

SPFA

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=10010;
int cnt,n,m,s;
int head[MAXN];
int d[MAXN];
int b[MAXN];
struct Edge{
int s,t,w,next;
}edge[500010]; void add(int u,int v,int wi){
cnt++;
edge[cnt].s=u;
edge[cnt].t=v;
edge[cnt].w=wi;
edge[cnt].next=head[u];
head[u]=cnt; } void spfa(){
queue<int>q;
for(int i=1;i<=n;i++){
d[i]=2147483647;
b[i]=0;
}
q.push(s);d[s]=0;b[s]=1;
while(!q.empty()){
int u=q.front();
q.pop();
b[u]=0;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].t;
if(d[v]>d[u]+edge[i].w){
d[v]=d[u]+edge[i].w;
if(b[v]==0){
b[v]=1;
q.push(v);
}
}
}
}
}
int main(){ scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
spfa();
for(int i=1;i<=n;i++){
printf("%d ",d[i]);
}
return 0;
}

最短路径问题---Floyed(弗洛伊德算法),dijkstra算法,SPFA算法的更多相关文章

  1. Bellman-Ford算法的改进---SPFA算法

    传送门: Dijkstra Bellman-Ford SPFA Floyd 1.算法思想 Bellman-Ford算法时间复杂度比较高,在于Bellman-Ford需要递推n次,每次递推需要扫描所有的 ...

  2. 算法笔记_071:SPFA算法简单介绍(Java)

    目录 1 问题描述 2 解决方案 2.1 具体编码   1 问题描述 何为spfa(Shortest Path Faster Algorithm)算法? spfa算法功能:给定一个加权连通图,选取一个 ...

  3. 最短路径问题的Dijkstra和SPFA算法总结

    Dijkstra算法: 解决带非负权重图的单元最短路径问题.时间复杂度为O(V*V+E) 算法精髓:维持一组节点集合S,从源节点到该集合中的点的最短路径已被找到,算法重复从剩余的节点集V-S中选择最短 ...

  4. 【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)

    题意:有N个潜在的bug和m个补丁,每个补丁用长为N的字符串表示.首先输入bug数目以及补丁数目.然后就是对M个补丁的描述,共有M行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,第 ...

  5. 几大最短路径算法比较(Floyd & Dijkstra & Bellman-Ford & SPFA)

    几个最短路径算法的比较:Floyd 求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3).       Floyd-Warshall算法(Floyd ...

  6. 最短路-SPFA算法&Floyd算法

    SPFA算法 算法复杂度 SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环. SPFA一般情况复杂度是O(m)最坏情况下复杂度和朴素 ...

  7. java实现SPFA算法

    1 问题描述 何为spfa(Shortest Path Faster Algorithm)算法? spfa算法功能:给定一个加权连通图,选取一个顶点,称为起点,求取起点到其它所有顶点之间的最短距离,其 ...

  8. 10行实现最短路算法——Dijkstra

    今天是算法数据结构专题的第34篇文章,我们来继续聊聊最短路算法. 在上一篇文章当中我们讲解了bellman-ford算法和spfa算法,其中spfa算法是我个人比较常用的算法,比赛当中几乎没有用过其他 ...

  9. Bellman-Ford算法与SPFA算法详解

    PS:如果您只需要Bellman-Ford/SPFA/判负环模板,请到相应的模板部分 上一篇中简单讲解了用于多源最短路的Floyd算法.本篇要介绍的则是用与单源最短路的Bellman-Ford算法和它 ...

  10. 使用spfa算法判断有没有负环

    如果存在最短路径的边数大于等于点数,就有负环 给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你判断图中是否存在负权回路. 输入格式 第一行包含整数n和m. 接下来m行每行 ...

随机推荐

  1. Linux服务器下安装Composer 并使用Composer安装Thinkphp5.0

    Composer官方文档:https://docs.phpcomposer.com/00-intro.htmlComposer是一个php的包管理器.要求php版本在5.3以上. 一.安装Compos ...

  2. 【SpringBoot1.x】SpringBoot1.x 启动配置原理 和 自定义starter

    SpringBoot1.x 启动配置原理 和 自定义starter 启动配置原理 本节源码 启动过程主要为: new SpringApplication(sources) 创建 SpringAppli ...

  3. MySQL多版本并发控制——MVCC机制分析

    MVCC,即多版本并发控制(Multi-Version Concurrency Control)指的是,通过版本链维护一个数据的多个版本,使得读写操作没有冲突,可保证不同事务读写.写读操作并发执行,提 ...

  4. Docker学习笔记之基本命令使用

    测试的环境为Ubuntu1804. 1. search命令搜索镜像 sudo docker search centos 搜索centos相关的镜像,可以看到第一个最多星的的centos是官方的镜像,而 ...

  5. 用 CSS background 实现刻度线的呈现

    有的时候,我们需要在网页中的进度条或某种度量计上呈现一条条的刻度线.例如这种: 简单的实现方式,大致有两种:一是用图片做背景,横向平铺线条图片:二是给每一块刻度区域平铺一个元素,然后用边线实现.身为一 ...

  6. PW6513高压40V的LDO芯片,SOT89封装

    一般说明 PW6513系列是一款高精度,高输入电压,低静态电流,高速,低具有高纹波抑制的线性稳压器.输入电压高达40V,负载电流为在电压=5V和VIN=7V时高达300mA.该设备采用BCD工艺制造. ...

  7. vue-cli3x4x修改本地端口port

    一.推荐方法 "scripts": { "serve": "vue-cli-service serve --port 3000", &quo ...

  8. Git安装/VScode+Git+Github

    Git安装/VScode+Git+Github 1. 相关简介 git 版本控制工具,支持该工具的网站有Github.BitBucket.Gitorious.国内的OS China仓库.Csdn仓库等 ...

  9. 【原创】Linux虚拟化KVM-Qemu分析(八)之virtio初探

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...

  10. linux--关于JVM CPU资源占用过高的问题排查

    一.背景: 先执行一个java程序里面开了两个线程分别都在while循环做打印操作. # java -cp ./test-threads.jar com.spiro.Main 二.现象: 通过top命 ...