动态规划-有向无回路图中两点间最远距离

shader编程-2D基本图形SDF(有向距离场)介绍与使用(WebGL-Shader开发基础05) shader编程-2D基本图形SDF有向距离场介绍与使用1. 有向距离场介绍2. SDF绘制圆3. SDF绘制矩形4. SDF绘制线段 1. 有向距离场介绍 有向距离场,英文名Signed Distance Field,简称SDF,把空间中与物体表面的距离进行采样,使用负值表示物体内部,使用正值表示物体外部,与物体的表面的距离为0,大于0,小于0和等于0区分物体的区域,你很快可以联想到之前使用的step函数和smoothstep函数,是的,通过与这两个函数的配合,就可以像前面样绘制图形了 2. SDF绘制圆 阅读详情

题目来源于《算法导论》第15章动态规划的习题 15-1,显然建议使用DP

对最小距离大家应该都比较熟悉,比如对非负权值图中有Dijkstra算法,对负权值图中有Ford算法。  最远距离?假设从A到F的最远距离为A->C->D->E->F, 为什么D->E->F一定会是从D到F的最远距离?我在这点证明困扰了很久,直到最近才想明白其中原理。

当重新审视有向(directed) 无回路(acyclic)这两个词时,我才突然想到原来可以这样证明:

依然假设A到F的最远距离为A->C->D->E->F, 现在考虑从D到F:如果存在B,使得D->B->F更远,那么我们直接可以用这段路径代替D->E->F, 这与我们之前的假设相矛盾;如果D经过C再到达F的距离更远,比如D->C->(E)->F, 那就说明存在回路D<->C, 这与条件相矛盾。所以,这里,D->E->F必然是从D到F的最远路径。算法的理论基础终于找到了!

OK,既然最远子路径是问题的必要条件,那么反过来,我们找到每一个点(除了终点以外)到达终点的最远路径,就可以作为整个问题的充分条件。我们需要一个合适的顺序,遍历所有顶点,从终点开始,逐渐向外扩展。问题到了这里就很明显了,采用拓扑序,广度优先的方式遍历。

具体实现中,我用了一个queue存放BFS中覆盖到的顶点。注意在每加入一个新的顶点v时,除了要遍历已计算过的顶点再确定最大的path[v]时,还要反过来考虑对于已经计算过最远距离的顶点u,如果存在权边u->v,那么path[u]也可能需要更新,这一步是最远路径问题相比于最短路经多出来的一步。

建议同学们自己实现一遍整个方法。因为对于图论问题,实现算法会产生很多自己独到的感觉,尤其是一些辅助性的数据结构。以下是我的一份实现:

int longestpath(int** adjMtx, int n, int s, int t){
    int* paths = new int[n](); //paths[i] means path from i to t
    int* entries = new int[n](); //mark whether vertex has been pushed to queue
    int* pnext = new int[n](); //pnext[i] means for longest path (i,t), next vertex
    queue<int> vqueue;
    vqueue.push(t);
    entries[t]=1;
    while(!vqueue.empty()){
        int v = vqueue.front();
        vqueue.pop();
        if(v != t){ //update paths[v], while paths[t] = 0
            int* edgesv = adjMtx[v];
            for(int i=0;i<n;++i){ //edgesv[i] means edge (v,i)
                if(i != v && edgesv[i] != 0){
                    if(paths[v] < edgesv[i] + paths[i]){ //update path(v,t) if it < edge(v,i) + path(i,t)
                        paths[v] = edgesv[i] + paths[i];
                        pnext[v] = i;
                    }
                }
            }
            for(int i=0;i<n;++i){ //update paths[i] if paths[i] < edge(i,v) + paths[v]
                if(i != v && paths[i] > 0 && adjMtx[i][v] != 0 && adjMtx[i][v] + paths[v] > paths[i]){
                    paths[i] = adjMtx[i][v] + paths[v];
                    pnext[i] = v;
                }
            }
        }
        for(int i=0;i<n;++i){ //push i if edge (i,v) occurs
            if(i != v && adjMtx[i][v] != 0 && entries[i]==0){
                vqueue.push(i);
                entries[i]=1;
            }
        }
    }
    int vn = s;
    printf("the longest path from %d to %d is: %d", s, t, vn);
    while(pnext[vn] != 0){
        vn = pnext[vn];
        printf(" -> %d", vn);
    }
    printf("\n");
    int sum = paths[s];
    /*delete paths, entries, pnext*/
    return sum;
}
另外说下测试数据,下面是我用到的两个图

图一从A到F,最远路径为A->B->C->E->F,长度为10;图二从A到E,最远路径是A->D->B->C-E, 长度为8.


动态规划之任意顶点间最短距离 A,动态规划思想:假设带权有向图G中的任意编号为(V1,V2,V3,...,Vn),如果 Vi到Vj的最短路径是d(i,j),那么对于路径上任一中间节点k,d(i,k)与d(k,j)都是最短路径。Vi到Vj的最短路径要么经过k,要么不经过k,就如同动态规划解矩阵连乘问题一样,我们只要从i到j枚举k,有j-i个选择,但是矩阵加括号后,其子问题之间不会有交点。对于图而言,如果不加限制d与d可能会有交集 阅读详情

相关推荐

判断无向图是否有回路

 如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=2。 n算法:      第一步:删除所有度的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一。      第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。      如果最后还有未删除顶点,则存在环,否则没有环。 n算法分析:             由于有m条边,n

tattarrattat的专栏 9996

最远距离(树的直径)

我们规定,如果一个无向连通图满足去掉其中的任意一条边都会使得该图变得不连通,则称该图为有效无向连通图。给定一个n个点m条边的有效无向连通图,点的编号为1∼n,所有边的长度均为1。两点之间的距离定义为两点之间的最短距离。请你计算,给定图中距离最远的两个点之间的距离。输入格式第一行包含两个整数n,m。接下来m行,每行包含两个整数a,b,表示点a和点b之间存在一条无向边。输出格式一个整数,表示给定图中距离最远的两个点之间的距离。数据范围。

qq_60717298的博客 366

Cesium生态盘点:超图、火星3D等15个二次开发框架对比

本文深入解析Cesium生态中的15个二次开发框架,包括超图、火星3D等主流选择,帮助开发者根据项目需求进行精准选型。从性能表现、功能完备性、开发友好度等维度进行对比,特别适合需要处理地理空间数据和构建三维可视化的JavaScript开发者。

weixin_28197941的博客 497

图论(九)有向图和网络

文章目录有向图网络网络中的距离网络流极小割和最小割关键路径法 针对需要考虑方向性问题的建模 有向图 连通图G可强有向化当且仅当它没有桥,或者说任何一边都包含在某个圈内 连通无桥图的有向化 通过DFS生成树T 将每一边的方向定为指向较大的结点 将G中其余的边——不在T中的边——方向定为指向标记较小的结点 任何有向无圈图至少有1个0出度结点和1个0入度结点 竞赛图:每一对结点之间只有一条边 ...

lixiaoguai2017的博客 3636

【数字电源/MATLAB+PLECS】如何进行 Buck 数字电源仿真(二)PLECS 搭建开环 Buck 功率级

本文介绍了如何在PLECS中搭建开环Buck功率级模型,验证数字电源设计的基本思路。重点内容包括: 明确开发顺序:先开环验证功率级,再闭环设计控制器 搭建关键组件:输入电源、PWM模块、MOSFET开关、续流二极管、LC滤波电路及负载 设置初始参数:24V输入、12V输出、200kHz开关频率、22μH电感、100μF电容 测量关键波形:MOSFET Vds验证开关动作、电感电流纹波和输出电压稳态值 提供完整仿真模型和GitHub资源,便于读者复现验证 文章强调通过开环测试先确保功率级正确性,为后续闭环控制

weixin_43234123的博客 1218

杰理芯片外挂Flash音乐播放功能避坑指南(附FAT文件系统配置)

本文详细解析了杰理芯片外挂Flash实现音乐播放功能的技术要点与常见问题,包括硬件连接、SPI驱动配置、FAT文件系统烧录及音乐播放集成等关键环节。特别针对Flash选型、FAT文件系统配置等易错点提供实用解决方案,帮助开发者高效完成嵌入式音频系统开发。

yhn45678901的博客 833

寻找有向图网络中每个节点的最大传播路径长度

针对有向图G,寻找每个节点的最大传播路径长度。 如果一个节点没有邻居节点,则传播路径长度为0; 有向图,可能存在闭环路径,会造成在闭环回路中进行传播,陷入死循环; def get_max_path_list(G): path_len = [] for node in tqdm(list(g.nodes)): for _ in list(g.nodes): g.nodes[_]["state"]=0 g.nodes[node]["state"]=1 k = 0

Jerkang的博客 2060

并网逆变器学习笔记8---平衡桥(独立中线模块)控制

参考文献:《带独立中线模块的三相四线制逆变器中线电压脉动抑制方法》---赵文心。

圆桌骑士的博客 7306

Selenium反检测进阶:undetected_chromedriver无痕自动化实战

浏览器自动化在爬虫采集与自动化测试中应用广泛,但普通Selenium方案常因暴露自动化特征而被反爬机制拦截。这背后的核心在于浏览器指纹、navigator.webdriver属性以及CDP协议等底层特征识别。本文从反爬检测原理切入,分析网站如何利用多维指纹和行为模型区分真人,进而介绍无痕自动化工具undetected_chromedriver的底层机制,包括自动patch、属性伪装和交互模拟。通过环境搭建、真人操作细节及完整案例排查,帮助开发者绕过常见风控,同时强调合规边界。内容兼顾原理与实战,适合Pyth

weixin_33850890的博客 423

NXP KW45开发实战:如何在MCUXpresso IDE中正确配置J-Link并解决设备识别问题

本文详细介绍了在MCUXpresso IDE中配置J-Link以支持NXP KW45无线MCU开发的实战指南。从环境准备到J-Link深度配置,再到烧录流程优化和高级调试技巧,帮助开发者高效解决设备识别问题并提升开发效率。特别推荐使用JLinkRemoteServer.exe进行多设备并行调试,并提供了烧录速度优化和低功耗调试的实用技巧。

gray5的博客 864

YOLOv11改进 | 模型知识蒸馏篇 | 利用模型蒸馏改进YOLOv11进行无损涨点 | 离线蒸馏(附代码 + 完整文件 + 解析教程)

这篇文章给大家带来的最新改进是模型的蒸馏,利用教师模型指导学生模型从而进行模型的涨点,本文的内容不仅可以用于论文中,在目前的绝大多数的工作中模型蒸馏是一项非常重要的技术,所以大家可以仔细学习一下本文的内容,本文从YOLOv8的项目文件为例,进行详细的修改教程,文章内包括完整的修改教程,针对小白我出了视频修改教程,如果你还不会我提供了修改后的文件大家直接运行即可,所以说不用担心不会适用!模型蒸馏真正的无损涨点,蒸馏你只看这一篇文章就足够了!欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 4319

有向无回路图的理解

有向无回路图的理解 概念理解 DAG图Directed Acyclic Graph. 有向无回路图。 如果顶点表示活动,边表示活动间先后关系,那么这个图称为Activity On Vertex Network,即AOV网络。 如果顶点表示活动的开始或者结束等事件(活动的状态),用边表示活动,边的权值表示活动所需的时间,那么Activity A是Activity B的先决条件当且仅当A的终点...

博采众长,自成一派; 3140

AWS SQS跨账户访问失败排查指南

在使用AWS SQS(Simple Queue Service)时,跨账户访问是常见的业务场景。例如,账户A的应用程序向队列发送消息,账户B的消费者从队列拉取消息。尽管AWS官方文档明确支持此类配置,但在实际应用中,由于权限模型的复杂性,开发者和运维人员常会遇到“策略已配置但无法接收消息”的问题。通过本文的逐步排查指南,您不仅可以解决当前问题,还能深入理解AWS跨账户访问的权限模型。接收方账户的用户或角色必须同时附加IAM策略,显式授权操作目标队列。尽管策略看似允许接收方操作,实际测试中却返回空消息或。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 458

[SDOI2013] 直径

SDOI2013 直径 题目描述 小Q最近学习了一些图论知识。根据课本,有如下定义。树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度。如果一棵树有N个节点,可以证明其有且仅有N-1 条边。 路径:一棵树上,任意两个节点之间最多有一条简单路径。我们用 dis(a,b)表示点a和点b的路径上各边长度之和。称dis(a,b)为a、b两个节点间的距离。 直径:一棵树上,最长的路径为树...

weixin_30698297的博客 176

使用 FastAPI 和 LangGraph 构建生产级智能体 AI 系统

这是一本关于使用 FastAPI 和 LangGraph 构建生产级智能体 AI 系统的详细书籍,全文约 10 万字。《Production-Grade Agentic AI System Design and Implementation: Building Agentic AI Systems Using FastAPI and LangGraph》随着人工智能(AI)技术的迅猛发展,智能体(Agent)作为能够自主感知、推理、决策和行动的实体,正逐渐成为构建复杂智能系统的核心。从个性化推荐、客户服务到

AI天才研究院 346

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

有向图(Directed Graph)和有向无环图(Directed Acyclic Graph,DAG)代码实践

flyfish

二分掌柜的 1960

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

感知机学习中的基本量计算(有向距离、投影、W的方向)

见上图,设分界线两侧的X和X’,画出其到W的投影Y和Y‘。 要求证明:X和X’与W的投影值减去 ,其结果的正负值各不相同。 为原点到分界面的距离。 证明: 一、几个量的计算: 1.任意点X到W的投影: 由于向量a在向量b上的投影的计算为 因此:X到W上的投影为: X’到W上的投影为 2. 为分界面上某点X0到W的投影: 由于: ,因此: 二:若X与X’在分界线两侧,则必定有它们落在W上的投影点y与y’,分别位于y0’两侧。 分两种情况讨论: (1)如果设:X在W...

1319

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

点到平面距离:法向量方向决定正面

摘要:平面方程的法向量(A,B,C)定义了"正面"方向。点到平面的有向距离公式为(Ax+By+Cz+D)/|n|,其符号由点积决定:distance>0表示点在法向量指向侧(正面),distance<0表示在反方向侧。这与点积的几何意义一致,即点积为正时夹角小于90°,说明点在法向量方向侧。例如y=0平面,法向量(0,1,0)向上,点(0,1,0)在正面侧(distance=1>0),(0,-1,0)在反面侧(distance=-1<0)。法向量方向与距离符号的对

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1026

有向距离场(SDF)在Shader中的简单应用

SDF, 全称Signed Distance Filed,就是有符号的距离区域 看下简单的例子,一个圆型区域 那么我们定义一个距离场函数: float sdfCircle(vec2 tex, vec2 center, float dis) { return -length(vec2(tex - center)) + dis; } 传入的参数分别是:当前像素点坐标, 圆心坐标,半径,函数的返回值是一个有正负的浮点数,通俗点说就是在园内的区域返回的是一个正值,大小是离原边界的距离;而在圆外面的区域

qq_41841073的博客 3833

Hausdorff距离定义与计算方法

Hausdorff距离以费利克斯·豪斯多夫 (1868-1942) 的名字命名,是“一个集合到另一个集合中最近点的最大距离” [Rote91]。更正式地说,从集合 A 到集合 B 的豪斯多夫距离是一个最大最小函数,定义为:其中 a 和 b 分别是集合 A 和 B 中的点,d(a, b) 是这些点之间的任意度量;为简单起见,我们将 d(a, b) 视为 a 和 b 之间的欧几里得距离。1. h = 0以下是暴力计算过程的图示:Hausdorff距离计算:第一步Hausdorff距离计算:第二步。

新缸中之脑 6553

ANSYS的内嵌函数总汇

ansys中可以用*get命令获取信息。如:    *get,xx,node,i,loc,x 可以获取第i个节点的x坐标,即把第i个节点的x坐标赋给xx.     通过内嵌函数,我们可以很方便的实现上述过程: xx=nx(i), nx(i)就是ansys的一个内嵌函数。     下面我把ansys所有的内嵌函数都列举出来供各位参考: 1. distnd( i,j) — I,j 两点的距离 2. ...

SmileMoon's Home 6474

求图中任意一点能到达的最大距离(树形dp不会做,可以用树的直径)

https://cn.vjudge.net/contest/312854#problem/A A school bought the first computer some time ago(so this computer's id is 1). During the recent years the school bought N-1 new computers. Each new com...

小糊涂的博客 494

有向图和无向图最大距离的总结

前言: 感觉每次遇到有向图或无向图的题都是比赛时候嫌自己写的太乱,写了一半就不想写了,赛后看别人的代码直接orz,也太简洁了,所以今天打算对之前做过的图的各种距离问题进行一个总结,以后做到跟图有关距离有关的问题也持续更新在这里了。 1.无向图的直径(模板) cf 1294f : 题目链接 题意: 给你一个图,让你在这个图里选3个点,问你怎样选才能使得这三个点连线之间包含的边数最多,最后输出最多的边...

qq_43555854的博客 3335

设计一个算法,求不权无向图连通图G中距离顶点v的最远的一个顶点

思想:图G是不带权的无向连通图,一条边的长度为1,因此,求距离顶点v的最远的顶点,即求距离顶点v的边数最多的顶点。利用广度优先遍历算法,从v出发进行广度遍历,类似于从顶点v出发一层层地向外扩展,到达j, …,最后到达的一个顶点k即为距离v最远的顶点。遍历时利用队列逐层暂存各个顶点,最后出队的一个顶点k即为所求。如图所示: 对

wuruiaoxue的专栏 1万+

【算法系列04】动态规划及其应用

一、动态规划思想: 二、应用 1.每对结点间的最短路径(弗洛伊德算法) 任意两点之间可能存在第三个点使得距离两点之间距离变近(可能存在二个三个更多) 所以核心算法也就是 if(d[i][j]>d[i][k]+d[k][j] ) d[i][j]=d[i][k]+d[k][j]; 主要是要理解几个图,零阶矩阵来表示图,用path[ ][ ]来记录路程。 剩下的就是初始化一一赋值。 核...

qq_41898761的博客 281

有向无回路图拓扑排序C++实现

// 有向无回路图拓扑排序.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include&lt;iostream&gt; #define MAX 100 using namespace std; enum Color{white,gray,black}; struc...

pleasetojava 283
上一篇: 动态规划-字符串处理二题
下一篇: 二分查找-两已排序数组中找中位数二题
teaspring
博客等级 码龄19年 350粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值