最短路 dij floy spfa
例题 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相关推荐
- [图论]最短路计数(spfa)
最短路计数 Description 给出一个NN个顶点MM条边的无向无权图,顶点编号为1-N1−N.问从顶点11开始,到其他每个点的最短路有几条. Input 第一行包含22个正整数N,MN,M,为图 ...
- 最短路——最短路计数(spfa)
题目链接 最短路--最短路计数(spfa) 题目描述 给出一个 N 个顶点 M 条边的无向无权图,顶点编号为 1-N.问从顶点 1 开始,到其他每个点的最短路有几条. 输入格式 第一行包含 2 个正整 ...
- 最短路模板:dij,spfa与floyd
图论技能get! 一个超强大的建图网站 最短路问题 1.dij算法 用于单源最短路 仅适用于没有负边权的情况 初始化dis数组为inf,dis[起点]=0: tool:priority-queue(按 ...
- POJ-3013: Big Christmas Tree(dij,spfa)
POJ-3013: Big Christmas Tree 题目链接:POJ:3013 Description Christmas is coming to KCM city. Suby the loy ...
- 蓝桥杯最短路(java过)spfa单源最短路算法
spfa 百度百科上spfa的思路为:动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最 ...
- 【最短路】【spfa】小vijos P1447 Updown
小vijos P1447 Updown 背景 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘 的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨 ...
- 洛谷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 ...
- 【最短路】【SPFA】单源最短路径 (luogu 3371)
单源最短路径 luogu 3371 题目大意: 求出一个点到其他点的最短路 原题: 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 ...
- 【图论】【最短路】【SPFA】【USACO题库】2.4.4 Bessie Come Home回家(jzoj 1274)
Bessie Come Home回家 题目大意: 有n条路连接着一些牧场,每个牧场由'a-z'(没羊)和'A-Y'(有一头羊),问哪个有羊的牧场离'Z'最近 INPUT FORMAT 第 1 行: 整 ...
最新文章
- Windows Server 2012 r2 显示计算机图标
- matlab读取格式重复,matlab - 为什么Xlsread以字符串形式读取(日期时间) - 堆栈内存溢出...
- JS实例操作QQ空间自动点赞方法
- 对于mysql加索引,删除索引,添加列,删除列,修改列顺序的最佳办法测试
- 前端学习(2230):react条件渲染实现登录二
- C++算法一些常用的stl函数
- 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】
- threading.Event
- 淘宝质量属性场景分析
- 2017web前端实习生面试总结 - 360奇舞团 京东商户物流
- Mac 原生词典扩展词库
- 签名工具类---Signature
- Wireshark设置显示报文的时间
- mysql系统表存放表结构_mysql数据库表结构
- HDU1728 BFS
- python 建站 上传文件_Python sdk上传
- ISO8601标准时间格式
- JSON.stringify(value [, replacer] [, space])
- 赛事相关 | 你好,微信大数据挑战赛,我是TI-ONE
- js基础-语法(switch)