例题 hdu1874 https://blog.csdn.net/murmured/article/details/18568657

一、Dijkstra

不可以算权值为负数的图

Dijkstra单源最短路算法,即计算从起点出发到每个点的最短路。所以Dijkstra常常作为其他算法的预处理。

使用邻接矩阵的时间复杂度为O(n^2),用优先队列的复杂度为O((m+n)logn)近似为O(mlogn)

为朴素版本:

http://blog.51cto.com/ahalei/1387799

还有一个 堆优化+邻接表(链式前向星)优化版本:

const int maxn=1000005;
const int inf=0x3f3f3f3f;
struct Edge{int v,w;//w为距离 int next;
};
Edge edge[maxn];//边编号  从1开始
struct qnode{    //堆优化 int u;   //起点 int w;//距离qnode(int u=0,int w=0):u(u),w(w){}//结构体重载 bool operator < (const qnode& a) const{return w>a.w;}
};
long long dis[maxn];
int head[maxn];
bool vis[maxn];
int x[maxn],y[maxn],z[maxn];
int n,m;
int size;
void add_edge(int u,int v,int w){//邻接表加边 edge[size].v=v;edge[size].w=w;edge[size].next=head[u];head[u]=size;size++;
}
void dijkstra(int s){priority_queue<qnode>q;while(!q.empty())q.pop();q.push(qnode(s,0));dis[s]=0;while(!q.empty()){qnode t=q.top();q.pop();int u=t.u;if(vis[u])continue;vis[u]=true;//找到一个点就标记一次 for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].v;int w=edge[i].w; if(!vis[v]&&dis[v]>dis[u]+w){dis[v]=dis[u]+w;q.push(qnode(v,dis[v]));//存到队堆里会自动利用堆 进行排序; } }  }
}

{邻接表:http://blog.51cto.com/ahalei/1391988

其实我咋感觉 领接表 与 链式前向星一样啊

二、floyd

可以解决传递闭包问题

可以处理边是负数的情况,判断图中是否为有负圈,检查是否存在dis[i][i]是否为负数

处理回路(环)就看dis[i][i]。(Floyd 和 bellman-ford 都可已处理环)

任意两点间的短路问题

三、SPFA(bellman-ford)

单源最短路径    可以判断负环

bellman-ford算法的基本思想是,对图中除了源顶点s外的任意顶点u,依次构造从s到u的最短路径长度序列dist[u],dis2[u]……dis(n-1)[u],其中n是图G的顶点数,dis1[u]是从s到u的只经过1条边的最短路径长度,dis2[u]是从s到u的最多经过G中2条边的最短路径长度……当图G中没有从源可达的负权图时,从s到u的最短路径上最多有n-1条边。因此,dist(n-1)[u]就是从s到u的最短路径长度,显然,若从源s到u的边长为e(s,u),则dis1[u]=e(s,u).对于k>1,dis(k)[u]满足如下递归式,dis(k)[u]=min{dis(k-1)[v]+e(v,u)}.bellman-ford最短路径就是按照这个递归式计算最短路的。

bellman-ford算法    Bellman-ford 算法:一个具有n个顶点的图如果不存在环,则从顶点x,到顶点y,最多经过n-1条边(要考虑连通性,每个顶点最多经过 1 次),因此 x 到 y 的最短路 最多经过 n - 1 次松弛操作(就是更新长度)就应该出现,如果第 n 次松弛还可以得到最优,那么这个图就肯定是存在环了(直接用Dijkstra 就无法得到最优的,环的存在会影响最优解是否存在)。

SPFA的实现如下:用数组dis记录更新后的状态,cnt记录更新的次数,队列q记录更新过的顶点,算法依次从q中取出待更新的顶点v,按照dis(k)[u]的递归式计算。在计算过程中,一旦发现顶点K有cnt[k]>n,说明有一个从顶点K出发的负权圈,此时没有最短路,应终止算法。否则,队列为空的时候,算法得到G的各顶点的最短路径长度。

多次入队因为因为SPFA没有向迪杰斯塔拉算法那样,寻找dist[]的最小值,所以重复入队用所有结点来进行松弛,更新dis[]的最小值,因为这个点本身dis[]的变化,会影响到与之邻接的点,所以要重复入队。

判断负环代码如下( 与不判断只差两行)

    bool spfa()    {    for(int i=0;i<=n;i++)    dis[i]=INF;    bool vis[MAXN]={0};    int cnt[MAXN]={0};    queue<int> q;    dis[0]=0;    vis[0]=true;    cnt[0]=1;    q.push(0);    while(!q.empty())    {    int cur=q.front();    q.pop();    vis[cur]=false;    for(int i=head[cur];i!=-1;i=e[i].next)    {    int id=e[i].to;    if(dis[cur] + e[i].val > dis[id])    {    dis[id]=dis[cur]+e[i].val;    if(!vis[id])    {    cnt[id]++;    if(cnt[cur] > n)    //判断负环return false;    //结束函数vis[id]=true;    q.push(id);    }    }    }    }    return true;    }   

最短路 dij floy spfa相关推荐

  1. [图论]最短路计数(spfa)

    最短路计数 Description 给出一个NN个顶点MM条边的无向无权图,顶点编号为1-N1−N.问从顶点11开始,到其他每个点的最短路有几条. Input 第一行包含22个正整数N,MN,M,为图 ...

  2. 最短路——最短路计数(spfa)

    题目链接 最短路--最短路计数(spfa) 题目描述 给出一个 N 个顶点 M 条边的无向无权图,顶点编号为 1-N.问从顶点 1 开始,到其他每个点的最短路有几条. 输入格式 第一行包含 2 个正整 ...

  3. 最短路模板:dij,spfa与floyd

    图论技能get! 一个超强大的建图网站 最短路问题 1.dij算法 用于单源最短路 仅适用于没有负边权的情况 初始化dis数组为inf,dis[起点]=0: tool:priority-queue(按 ...

  4. POJ-3013: Big Christmas Tree(dij,spfa)

    POJ-3013: Big Christmas Tree 题目链接:POJ:3013 Description Christmas is coming to KCM city. Suby the loy ...

  5. 蓝桥杯最短路(java过)spfa单源最短路算法

    spfa 百度百科上spfa的思路为:动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最 ...

  6. 【最短路】【spfa】小vijos P1447 Updown

    小vijos P1447 Updown 背景 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘 的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨 ...

  7. 洛谷P1144-最短路计算【日常最短路,日常图论,SPFA】

    题目 一个无向图,求点1到每个点的最短路的路径数量 输入 5 7(5个点,7条边) 1 2(表示1到2有边) 1 3 2 4 3 4 2 3 4 5 4 5 输出 (答案mod100003) 1 1 ...

  8. 【最短路】【SPFA】单源最短路径 (luogu 3371)

    单源最短路径 luogu 3371 题目大意: 求出一个点到其他点的最短路 原题: 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 ...

  9. 【图论】【最短路】【SPFA】【USACO题库】2.4.4 Bessie Come Home回家(jzoj 1274)

    Bessie Come Home回家 题目大意: 有n条路连接着一些牧场,每个牧场由'a-z'(没羊)和'A-Y'(有一头羊),问哪个有羊的牧场离'Z'最近 INPUT FORMAT 第 1 行: 整 ...

最新文章

  1. C++报错无效的预处理命令include_无废话--Mac OS, VS Code 搭建c/c++基本开发环境
  2. 汤家凤高等数学基础手写笔记-曲线与曲面积分
  3. asp.net javascrip获取session的值_一篇文章搞定 Django Cookie 与 Session
  4. antd autoplay按f12才会轮播_涨知识了!原来这才是电脑键盘上,F1到F12的正确用法...
  5. 总结 | “卷积”其实没那么难以理解
  6. Ubuntu上通过FinalShell或Asbru访问CentOS虚拟机
  7. AndroidStudio安卓原生开发_UI控件介绍---Android原生开发工作笔记96
  8. oracle的nvl和nvl2是什么函数,两者区别
  9. 讲师BLOG:http://linuxguest.blog.51cto.com/
  10. 素数II题解(素数筛)
  11. 阿里巴巴大数据竞赛-天池
  12. js中this是什么?this的5种用法
  13. OpenSSL自建CA和颁发SSL证书
  14. CentOS 无法连接网络解决办法
  15. 制作人 Joe Carrell 教你充分释放TB12音色野兽
  16. 如何重装java tm_彻底重装JDK的方法
  17. 如何解决电脑使用中任务栏“卡死”问题。
  18. POJ 3713 枚举 + Tarjan 割点
  19. Mendix POC 项目分享——系统需求说明书
  20. 反弹shell和键盘记录器实现

热门文章

  1. 【cx_Oracle】记录一次 python cx_Oracle出现 ORA-00911: 无效字符
  2. 关于修复mp4文件损坏的过程小记
  3. STM32堆栈溢出的主要的问题和现象
  4. JAVA高级---(2)15分钟入门JVM底层原理
  5. A Strong Baseline and Batch Normalization Neck for Deep Person Re-identification(论文笔记)(2019CVPR)
  6. 使用FileZilla连接时超时,无法连接到服务器
  7. 数据挖掘技术的来源、历史、研究内容及常用技术
  8. RFID-MFRC522射频识别模块,S50卡M1
  9. 第一章 计算机系统概述
  10. 什么是Java SE、Java EE、Java ME?