DAG单源最短路径
来源:互联网 发布:thug life 视频软件 编辑:程序博客网 时间:2024/05/22 02:44
1、基本算法
我们知道DAG上一定存在拓扑排序,且若在有向图G中从顶点Vi->Vj有一条路径,则在拓扑排序中顶点Vi一定在顶点Vj之前,而因为在DAG图中没有环,所以按照DAG图的拓扑排序进行序列最短路径的更新,一定能求出最短路径。
2、基本步骤
处理顶点V时,对每条离开的边<v,u>执行松弛运算,若果<v,u>给出从源点到u的一条最短路径(经过v),则更新到u的最短路径。这个过程将检查图中每个顶点的所有路径,同时,拓扑排序确保按正确的顺序处理顶点。
4、注意事项
图必须是DAG(有向无环图),跟差分约束类似,对于多源点向单源点转化时新加入的节点可以通过特殊的预处理老避免在实际代码中加入这个节点,在DAG图上的单源最短路径的代码中,是将入度为0的节点(也就是前面所说的多源点)的d[]值设为0,其他的d值设为INF,也就是相当于虚拟节点Vs更新之后的结果。
伪代码:
(1)初始化,入度为0的节点d为0,其他的节点d值为INF。
(2)对DAG进行拓扑排序,得到拓扑序列。
(3)按照拓扑序列遍历DAG的点,对于每个点u,遍历其所有的出边<u,v>,如果d[v] > d[v] + length<u,v>,则更新。
#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <string>#include <algorithm>using namespace std;const int MAXN = 1010;const int MAXM = 1000010;struct Edge{int v, w;int next;}edge[MAXM];int n, m;int cnt;int first[MAXN], d[MAXN];int pa[MAXN];void init(){cnt = 0;memset(first, -1, sizeof(first));memset(pa, 0, sizeof(pa));}void read_graph(int u, int v){edge[cnt].v = v;edge[cnt].next = first[u], first[u] = cnt++;}void toposort(){for(int i = 1; i <= n; i++) if(!ind[i]) q.push(i);int tot = 0;while(!q.empty()){int u = q.front(); q.pop();topo[++tot] = u;for(int e = first[u]; e != -1; e = edge[e].next){int v = edge[e].v;if(--ind[v] == 0){q.push(v);}}}if(tot != n) return 0; return 1;}void DAGShortestPath(int src){for(int i = 1; i <= n; i++)if(!ind[i]) d[i] = 0;else d[i] = INF; //预处理,入度为0的点d值为0d[src] = 0;for(int u = 0; u < tot; u++){int x = topo[u];for(int e = first[x]; e != -1; e = edge[e].next){int v = edge[e].v, w = edge[e].w;if(d[v] > d[x] + w) //relax{d[v] = d[x] + w;pa[v] = u;}}}}
- DAG单源最短路径
- DAG单源最短路径
- DAG单源最短路径
- DAG单源最短路径
- DAG单源最短路径
- 算法导论 单源最短路径 DAG-SHORTEST-PATHS
- 单源最短路径(三)————Dag实现
- DAG图上单源最短路径 poj 3249
- poj2594(DAG最小路径覆盖)
- 图--有向无负权回路的单源最短路径 DAG 算法导论p365
- POJ3249 工作难题(DAG有向无环图的单源最短路径)
- 应用拓扑排序来解决DAG(directed acylic graph)的单源最短路径问题
- POJ 3249 Test for Job DAG图上的单源最短路径
- POJ 3249 Test for Job (DAG图上的单源最短路径) 最详细的图解
- DAG图中的关键路径算法
- POJ 1548 Robots(DAG最小路径覆盖)
- HDU 4160 Dolls(DAG最小路径覆盖)
- POJ1422 Air Raid 【DAG最小路径覆盖】
- Flash中JSON的使用
- 今天复习的内容
- eval解析JSON中的注意点
- socket通信:C#实现Socket通信
- linux进程间传递描述符
- DAG单源最短路径
- Invalid ActiveMQ Schema Name Space
- Ios左右菜单PPRevealSideviewController使用的一些心得
- 利用OpenCV计算并绘制灰度直方图 (转载)
- 使用AF_INET实现UDP点对点通信示例
- Windows2003服务器安装及设置教程——MySQL安全篇
- 关于Android的Crash
- 解决XP 系统 .Net Framework 4安装时出现严重错误 (0x80070643)
- DB2日期时间型数据类型介绍