Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >计算DAG中每个顶点的单源最短路径算法背后的直觉

计算DAG中每个顶点的单源最短路径算法背后的直觉
EN

Stack Overflow用户
提问于 2016-05-16 04:17:02
回答 3查看 1.9K关注 0票数 3

该算法如下:

该算法首先对数据进行拓扑排序(参见第22.4节),在顶点上强制线性排序。如果dag包含从顶点u到顶点v的路径,那么在拓扑排序中,u先于v。在拓扑排序的顺序中,我们只对顶点进行一次遍历。当我们处理每个顶点时,我们放松每一条离开顶点的边缘。

谁能告诉我背后的直觉吗?使用这种直觉,请告诉我们如何找到最长的路径,只要取取边权值,并运行算法。

我们不能使用Dijkstra的算法,因为边被允许有负权。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-16 18:29:38

如果您已经知道到达顶点之前的所有顶点的最短路径,那么找到到达顶点的最短路径是很容易的。在DAG中找到一个顶点的最长路径是很容易的,如果您已经知道能够在它之前的所有顶点的最长路径。

按拓扑顺序处理顶点,可以确保到到达顶点时,已经处理了所有可以在顶点之前的顶点。

Dijkstra的算法对于包含圈的图是必要的,因为它们不能按拓扑排序。

票数 10
EN

Stack Overflow用户

发布于 2016-05-17 02:31:38

您的问题与DAG中的单源最短路径问题(SSSP)有关.图的拓扑排序表示图的线性排序。允许按拓扑顺序(从左到右)处理所有顶点,并利用松弛特性找到所有最短路径。算法的运行时间为O(|V| + |E|),其中V是一组顶点,E是一组边。

如果您想要找到最长的路径(或临界路径),接下来的变体如下:

第一种方法是负边权值。具有最小负值的路径将给出最长的路径(但对于算法来说,它仍然是最小的路径)。我们可以这样做,因为拓扑排序可能在负边权值下工作。

第二种方法是改变放松步骤:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. Cost of each vertex is initialized to negative infinity
2. Change the relaxation step:
  if d(v) < d(u) + w
  then d(v) = d(u) + w
  else d(v) is remains unchanged

where d - the distance;
u, v - vertices;
w - weight on edge (u, v).

求解SSSP问题的一般情况有Dijkstra算法和Bellman算法.主要的区别在于Bellman算法对图中的任意权值计算SSSP,并能检测出图中的负权圈,而Dijkstra的算法可以与正权值一起工作。

有关更多细节,请参见最短路径

票数 1
EN

Stack Overflow用户

发布于 2021-06-20 22:49:51

拓扑排序确保我们在从源旅行时首先选择节点,这将确保每个节点至少有一个可以从源到达的条件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (int i = 0; i < N; i++)
    if (visited[i] == false)
        topologicalSortUtil(i, visited, stack, adj);

for (int i = 0; i < N; i++)
    dist[i] = Integer.MAX_VALUE;
dist[s] = 0;

while (stack.empty() == false)
{
    int node = (int)stack.pop();

    if (dist[node] != Integer.MAX_VALUE)
    {
        enter code here  for(Pair it: adj.get(node)) {
            if(dist[node] + it.getWeight() < dist[it.getV()]) {
                dist[it.getV()] = dist[node] + it.getWeight(); 
            }
        }
    }
}

当我们设置distsrc = 0时,它将从那里开始,条件disnode != infinity将不允许除src之外的任何其他节点首先进入该条件。因为拓扑排序在src之前出现,所以src将被丢弃。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37253739

复制
相关文章
Vue 实现前进刷新,后退不刷新的效果
假设列表页为 list.vue,详情页为 detail.vue,这两个都是子组件。
谭光志
2020/09/28
3K0
RDP你的凭据不工作/RDP密码不刷新
如果你不属于上述的情况,请查看:https://learn.microsoft.com/zh-cn/windows-server/remote/remote-desktop-services/troubleshoot/rdp-error-general-troubleshooting#check-whether-a-group-policy-object-gpo-is-blocking-rdp-on-a-local-computer
阿龙w
2022/12/02
12.7K0
RDP你的凭据不工作/RDP密码不刷新
CDN刷新目录不生效?
选择 “刷新变更资源” 模式,当用户访问匹配目录下资源时,会回源获取资源的 Last-Modify 信息,若与当前缓存资源一致,则直接返回已缓存资源,若不一致,回源拉取资源并重新缓存;
任雯霄
2020/12/30
6.1K1
layui打开iframe窗口不刷新的问题
这个问题可能是我工作以来,最死磕不算bug的一个了,晚上熬夜到三点钟,终于找到了解决的办法。
王小婷
2019/04/29
4K0
layui打开iframe窗口不刷新的问题
vue 参数变化页面不刷新
查询参数变化,不刷新 http://localhost:8081/#/detail?id=1 http://localhost:8081/#/detail?id=2 参数变化,不刷新 http://
onety码生
2018/11/21
2.5K0
js – form表单提交不刷新
大家已经发现了, 当我们点击submit提交form表单的时候, 他会刷新一次, 如果不想它刷新的话有下面两种方法:
全栈程序员站长
2022/08/01
14.6K0
WPF 的 VisualBrush 只刷新显示的视觉效果,不刷新布局范围
WPF 的 VisualBrush 可以帮助我们在一个控件中显示另一个控件的外观。这是非常妙的功能。
walterlv
2023/10/22
4450
WPF 的 VisualBrush 只刷新显示的视觉效果,不刷新布局范围
MVC3和MVC4中CRUD操作
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116252.html原文链接:https://javaforall.cn
全栈程序员站长
2022/01/24
5070
控制器操作
一.控制器操作 我们首先复习一下基本的控制器定义和方法执行方式。 第一步:控制器默认创建在当前模块下的 Controller 目录下; 第二步:按照指定的命名规则:控制器名(首字母大写)+Controller.class.php; 第三步:控制器里的方法必须是 public 公共的; //控制器 class UserController extends Controller { public function index() { //index()方法在URL访问时可以忽略 } } URL 访问:http://localhost/demo39/User/index/
PM吃瓜
2019/08/13
6470
Vue 改变数据,页面不刷新的问题
最近在用 element-ui 开发一个网站,使用 table 组件时,发现修改完数据,有时候会延迟一两秒,页面才会发生变化。
谭光志
2020/09/28
3.4K0
vue强制刷新页面方法_vue页面回退不刷新
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/17
5K0
控制器操作【2】
三.跳转和重定向 ThinkPHP 在操作数据库时,需要跳转和重定向页面。ThinkPHP 提供了一组方法来解决了这个问题。 //成功和失败的跳转 class UserController extends Controller { public function index() { $flag = true; if ($flag) { //会跳转到:http://localhost/demo39/User/all $this->success('新增成功!', '../User/all'); } else { //会跳转到本页的上一页 $this->error('新增失败!'); } } } PS:success()方法和 error()方法,第一个参数是提示信息、第二个跳转的地址、第三个跳转时间。默认情况下 success()方法是 1 秒,error()方法是 3 秒。
PM吃瓜
2019/08/13
5730
控制器操作【3】
五.请求类型 ThinkPHP 提供了一组常量来判断当前请求是否是 GET、POST 等。通过判断请求处理不同的业务逻辑。 常量 含义 IS_GET 判断是否 GET 提交请求 IS_POST 判断是否 POST 提交请求 IS_PUT 判断是否 PUT 提交请求 IS_DELTE 判断是否 DELETE 提交请求 IS_AJAX 判断是否 AJAX 提交请求 //判断是否GET请求 if (IS_GET) { echo '是GET请求'; } else { echo '不是GET请求'; }
PM吃瓜
2019/08/13
5680
MVC3教程之新手入门
你还可以通过Web Platform Installer将这些软件一起安装到本地。
拓荒者IT
2019/09/26
1.5K0
MVC3教程之新手入门
git版本控制器的相关操作
git status 查看仓库状态 git diff <filename> 查看为提交的修改 git log 查看提交的日志 git log --pretty=oneline 单行显示
java攻城狮
2020/10/10
5490
git版本控制器的相关操作
学会这个小技巧,SSH 会话连接永远不超时!
通过指定时间间隔在客户端和服务器之间发送空数据包,可以避免 SSH 超时。 防止 SSH 客户端超时
iMike
2019/10/10
5.2K0
SDRAM控制器操作时序
IDLE 状态到WRITE 状态: ​ 1) 在IDLE 状态需要先给ACT 命令激活某一行,此时处于Row Active 状态; ​ 2) 在Row Active 状态之后,给Write 命令则会进入WRITE 状态; ​ 3) 在WRITE 状态后,再给一次Write 命令,就可以继续写入数据。 WRITE 状态到IDLE 状态: ​ 1) 在WRITE 状态给PRE 命令,则SDRAM 将跳出WRITE 状态进入Precharge状态; ​ 2) 在Precharge 状态后,就会自动进入IDLE 状态了。
全栈程序员站长
2022/09/16
7110
SDRAM控制器操作时序
已成功刷新dns解析缓存后怎么操作_刷新dns缓存的命令
步骤一、首先按住键盘win+R组合键,打开了一个运行窗口,之后在运行窗口上输入“CMD”命令,执行该命令即可打开命令提示符窗口了。
全栈程序员站长
2022/11/15
22K0
MVC 3.0 的新特性 摘要
MVC经过其1.0和2.0版本的发展,现在已经到了3.0的领军时代,随着技术的不断改进,MVC也越来越成熟。使开发也变得简洁人性化艺术化。
Isaac Zhang
2019/09/10
2.6K0
MVC 3.0 的新特性

            摘要
点击加载更多

相似问题

用于检查按下的键的函数的setTimeout (javascript)

10

函数键按下javascript

13

按下Javascript多个键

32

使用javascript按下"Delete“键?

413

扩展javascript键按下函数

35
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文