例题 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. Windows Server 2012 r2 显示计算机图标
  2. matlab读取格式重复,matlab - 为什么Xlsread以字符串形式读取(日期时间) - 堆栈内存溢出...
  3. JS实例操作QQ空间自动点赞方法
  4. 对于mysql加索引,删除索引,添加列,删除列,修改列顺序的最佳办法测试
  5. 前端学习(2230):react条件渲染实现登录二
  6. C++算法一些常用的stl函数
  7. 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】
  8. threading.Event
  9. 淘宝质量属性场景分析
  10. 2017web前端实习生面试总结 - 360奇舞团 京东商户物流
  11. Mac 原生词典扩展词库
  12. 签名工具类---Signature
  13. Wireshark设置显示报文的时间
  14. mysql系统表存放表结构_mysql数据库表结构
  15. HDU1728 BFS
  16. python 建站 上传文件_Python sdk上传
  17. ISO8601标准时间格式
  18. JSON.stringify(value [, replacer] [, space])
  19. 赛事相关 | 你好,微信大数据挑战赛,我是TI-ONE
  20. js基础-语法(switch)

热门文章

  1. matlab中Svmtrain和Svmpredict的用法
  2. 组件化、模块化、Composing Builds
  3. ROS中,DWA算法的实现
  4. NLP领域的最新研究进展
  5. response.setHeader()方法设置http文件头的值
  6. Bsp开发的几个层次
  7. 用我这些年的经历告诉你无力吐槽的自动化现状……
  8. Qt Quick实现的文件传输工具(TCP传输篇)
  9. 20个高级java开发面试题(带答案)
  10. ufo帧率测试网站_手机相机拍摄的视频帧率的测试方法