最短路模板(二)——用拓扑排序解决有向无环图中的最短路

DAG单源最短路径 1、基本算法 我们知道DAG上一定存在拓扑排序,且若在有向图G中从顶点Vi->Vj有一条路径,则在拓扑排序中顶点Vi一定在顶点Vj之前,而因为在DAG图中没有环,所以按照DAG图的拓扑排序进行序列最短路径的更新,一定能求出最短路径。 2、基本步骤 处理顶点V时,对每条离开的边执行松弛运算,若果给出从源点到u的一条最短路径(经过v),则更新到u的最短路径。这个过程将检查图中每个顶点的所有路径, 阅读详情

上一篇最短路文章:http://blog.youkuaiyun.com/synapse7/article/details/19218865


测试数据:

8 13
5 4 0.35
4 7 0.37
5 7 0.28
5 1 0.32
4 0 0.38
0 2 0.26
3 7 0.39
1 3 0.29
7 2 0.34
6 2 0.40
3 6 0.52
6 0 0.58
6 4 0.93

测试结果:

5 to 0 : 0.73
5 to 1 : 0.32
5 to 2 : 0.62
5 to 3 : 0.61
5 to 4 : 0.35
5 to 5 : 0.00
5 to 6 : 1.13
5 to 7 : 0.28


说明:该算法亦适用于含有负权重边的图。


代码:

#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<utility>
#include<functional>
using namespace std;
const int mx = 10005;

struct edge
{
	double cost;
	int to;
	void read()
	{
		scanf("%d%lf", &to, &cost);
	}
} e;

vector<edge> G[mx];
double disTo[mx];
bool vis[mx];
int topo[mx], cnt;

void dfs(int i)
{
	vis[i] = true;
	for (int j = 0; j < G[i].size(); ++j)
		if (!vis[G[i][j].to]) dfs(G[i][j].to);
	topo[cnt++] = i;
}

/// 有向无环图上的最短路
void dagSP(int s)
{
	int i = cnt, j, v;
	while (topo[--i] != s); /// 先在topo中找到s
	memset(disTo, 100, sizeof(disTo));
	disTo[s] = 0.0;
	for (; i >= 0; --i)
	{
		v = topo[i];
		for (j = 0; j < G[v].size(); ++j)
		{
			e = G[v][j]; /// v视作e.from
			disTo[e.to] = min(disTo[e.to], disTo[v] + e.cost);
		}
	}
}

int main()
{
	int n, m, i, a;
	while (~scanf("%d%d", &n, &m))
	{
		for (i = 0; i < n; ++i) G[i].clear();
		while (m--)
		{
			scanf("%d", &a);
			e.read();
			G[a].push_back(e);
		}
		memset(vis, 0, sizeof(vis));
		cnt = 0;
		for (i = 0; i < n; ++i)
			if (!vis[i]) dfs(i);
		dagSP(5);
		for (i = 0; i < n; ++i)
			printf("5 to %d : %.2f\n", i, disTo[i]);
		putchar(10);
	}
	return 0;
}

【董晓算法】算法知识之图论1(拓扑排序,多种最短路算法) 算法知识之图论(拓扑排序,多种最短路算法) 阅读详情

相关推荐

Gartner 2025 中国网络安全成熟度曲线深度解读:AI 安全如何重构防御逻辑

2025 年 Gartner 中国网络安全技术成熟度曲线的发布,标志着国内网络安全领域正式进入 “AI 原生防御” 时代。这份聚焦中国市场特性的报告清晰揭示:网络安全的核心命题已从 “防御 AI 驱动的攻击” 演进为 “保障 AI 系统自身安全与业务协同”,AI 安全技术正成为重构企业防御体系的核心引擎。

KKKlucifer的博客 1387

算法基础学习笔记——⑪拓扑排序\最短路

算法基础学习笔记——⑪拓扑排序\最短路

VLOKL的博客 1701

PHP实战:5分钟搞定SM4国密加密算法集成(附完整代码)

本文提供了一份可直接用于生产环境的PHP SM4国密加密算法集成实战指南。文章详细解析了SM4算法核心,对比了ECB与CBC工作模式,并给出了包含完整代码、密钥管理、数据填充及性能优化的解决方案,帮助开发者快速、安全地在PHP项目中集成国密加密算法。

2a4s6d8f0g的博客 341

图论模板(拓扑排序、最短路)

图论模板一、拓扑排序题意代码二、Dijkstra题意代码1(朴素版)代码2(堆优化版)2.读入数据总结 一、拓扑排序 题意 输出拓扑排序,如果不存在输出-1. 代码 void topsort() { queue<int> que; for(int i=1;i<=n;i++) if(!din[i]) que.push(i), ans[++num] = i; while(que.size()){ int t = que.fron

心升明月的博客 941

complier lab2

只需支持定义 main 函数即可不带参数 int main(){...}带参数 int main(int argc, int argv){...}

qq_43581843的博客 906

51单片机超声波测距数码管显示并报警(Proteus 仿真)

HC-SR04超声波 实物图 使用方法 1、给TRIG端口至少10us 的高电平信号 2、模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回 3、有信号返回,ECHO端口会输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间 计算的话这里就不考虑温度的影响直接用声速340m/s Proteus仿真 HC-SR04可以用Proteus中的SRF04代替 下面附上代码 ...

m0_46254883的博客 1万+

有向无环图的最短路径

给定一个有向无环图和源点s,并求s到其它各顶点的最短路径,在图中无负边时,通常采用Dijkstra算法(O(V^2)); 有负边是则采用Bellman-Ford算法(O(VE));均无法在线性时间内得到结果,而如果先对邻接表结构的有向图采用拓扑排序,得到排序后的数组print,然后从源点开始更新邻接结点的最小路径,最终可得到源点到其它所有结点的最短路径 关于拓扑排序,核心是先将所有入度为0的结点

ac@zhui的博客 2683

从想法到零件:手把手拆解一个汽车功能如何从PRD写到SSTS和CTS

本文详细拆解了汽车电子需求从市场文档(MRD)到零部件技术规范(CTS)的完整流程,以雨天自动关窗功能为例,展示了PRD、SSTS和CTS的编写要点与交互设计。文章重点解析了系统分解的艺术和零部件落地的精确参数要求,为汽车电子工程师提供了从概念到实现的全流程实践指南。

weixin_30300225的博客 481

处女座的比赛资格(拓扑排序)

链接:https://ac.nowcoder.com/acm/contest/329/B 来源:牛客网   题目描述   处女座想出去比赛,但是又不知道学校能不能给到足够的经费。然而处女座是大众粉丝,有着很好的人缘,于是他找了一个在学校管经费的地方勤工俭学偷来了一份报销标准。 由于处女座是万人迷,所以他在中间途径的每一条线路上都会发生一些故事,也许是粉丝给他发了一个200元的微信红包,也...

a1046765624的博客 686

香橙派5b 移植 imx415

修改设备树,以为例,关闭ov13855,添加imx4151;0;1;0;1;0;1;0;1;0;1;0;1;0;以此类推,修改三个dtsi。

ChenYX的博客 4536

cdk&java | 绘制含有丰富信息的化学反应(适合论文、网页、PPT)

package org.example; import org.openscience.cdk.DefaultChemObjectBuilder; import org.openscience.cdk.depict.DepictionGenerator; import org.openscience.cdk.exception.CDKException; import org.openscience.cdk.interfaces.IReaction; import org.openscience.cdk.

ASKCOS博客 897

【算法入门&图论】【模板】拓扑排序|【模板】单源最短路2 |最小生成树

本专栏收录的均为牛客网的算法题目,内含链表、双指针、递归、动态规划、基本数据结构等算法思想的具体运用。牛客网不仅有大量的经典算法题目,也有大厂的面试真题,面试、找工作完全可以来这里找机会。此外,网站内的编码主题多样化,调试功能可运用性强,可谓是非常注重用户体验。这么好的免费刷题网站还不快入手吗,快去注册开启算法百炼成神之路吧!

叶落秋白的博客 3641

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

图论:拓扑排序讲解,以及 Dijkstra算法,Bellman-Ford算法,spfa算法,Floyd算法模板大全

讲解最短路问题,以及拓扑排序, Dijkstra算法,Bellman-Ford算法,spfa算法,Floyd算法模板大全

2401_86619696的博客 2274

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

利用拓扑排序求 DAG 最短路

背景 给定一张带负权边的有向无环图(DAG),NNN 个点,MMM 条边,求源点到各点的最短路。 分析 因为有负权边,无法用 dijkstra 直接求最短路。 用 SPFA 又容易被出题人卡成傻子。 考虑到是 DAG,可以使用拓扑排序在 O(N+M)O\left( N+M \right)O(N+M) 时间范围内求出最短路。 步骤如下: 设源点为 sss,点到源点的最短路用数组 d[]d[]d[] 来储存,建一个队列 q[]q[]q[] 给拓扑排序用,再建一个数组 deg[]deg[]deg[] 用来存储每个

Dumblog 929

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【算法模板】图论:拓扑序+最短路+最小环

单源最短路径问题(Single Source Shortest Path,SSSP问题)是说,给定一张有向图G=(V,E),V是点集,E是边集,|V|=n,|E|=m,节点以[1,n]之间的连续整数编号, (x,y,z)描述一条从x出发,到达y,长度为z的有向边。综上,转移方程为f[k][i][j]=min(f[k-1][i][j],f[k-1][i][k]+f[k-1][k][j])。扫描节点x的所有出边(x,y,z),若dist[y]>dist[x]+z,则使用dist[x]+ z更新dist[y]。

2303_80346267的博客 1736

【算法入门&amp;图论】【模板】拓扑排序 【模板】单源最短路2 最小生成树_ab15 【模板(1)

本专栏收录的均为牛客网的算法题目,内含链表、双指针、递归、动态规划、基本数据结构等算法思想的具体运用。牛客网不仅有大量的经典算法题目,也有大厂的面试真题,面试、找工作完全可以来这里找机会。此外,网站内的编码主题多样化,调试功能可运用性强,可谓是非常注重用户体验。这么好的免费刷题网站还不快入手吗,快去注册开启算法百炼成神之路吧!

2401_84182578的博客 1186

最短路题目汇总与总结

主要介绍了本人在洛谷上刷的最短路类型的题目的经验总结

qq_51506533的博客 1184

最短路 算法解析+例题

最短路可以认为是图论最基础的内容之一,涉及到的算法也很多。为了方便,假设图有 $n$ 个点,$m$ 条边,$(u,v)$ 这条边的边权用 $w(u,v)$​ 表示。 ### 性质 有几条关于**边权为正**的图的最短路的性质: - 任意两点之间的最短路,不会经过重复的点和边。 - 任意两点之间的最短路,结点数不会超过 $n$,边数不会超过 $n-1$。 对于前者,由于边权为正,如果一条最短路需要经过重复的点或边,更优的做法显然是在**第一次经过这个点或者边时**

UnderTheTimeの博客 2687

【拓扑排序】拓扑排序模板题 / 课程表 / 课程表 II / 火星词典

拓扑排序模板题 / 课程表 / 课程表 II / 火星词典

小羊的博客 1178

【算法入门&amp;图论】【模板】拓扑排序 【模板】单源最短路2 最小生成树_ab15 (1)

对一个。

2401_84616088的博客 1203

【算法入门&amp;图论】【模板】拓扑排序 【模板】单源最短路2 最小生成树_ab15 【模板

对一个。

2401_84170337的博客 782

备战蓝桥杯---图论之最短路dijkstra算法

先分个类吧。

cocoack的博客 1135

拓扑排序(模板)

u107394 #include<bits/stdc++.h> using namespace std; const int maxn=100005; vector<int>adj[maxn]; int degree[maxn]; int main(){ int n,m; cin>>n>>m; while(m--){ int a,b; cin>>a>>b; adj[a].push_back(b); d

Gyibin的博客 210

HDU最短路总结

最近过的最短路题目稍微总结一下,顺便写一下模板,最短路算法众多有floyd、dij、bell-man、spfa,速度最快就是dij+优先队列或者dij+堆排序,spfa理论上很快o(ke)但实际并不一定不过spfa传说中有一个很NB用处就是处理带负权回路。邻接表VS邻接矩阵:根据

mr_lee 6486

专题十七_BFS_BFS解决 FloodFill 算法_BFS 解决最短路问题_多源 BFS_BFS 解决拓扑排序

数组来将基因库里面的所有字符串全部都存入并置为false,那么就进行将所有于当前只差一个字符的字符串全部都入队列,就是证明下一层的所有字符都被入了队列,然后再次进行判断,判断出与这个新的一层只差一个字符的字符串有哪些,就这样循环往复,直到入队列的某一刻,遇到了与end字符串相等的那一个字符串,那么就可以进行返回当前的层数,此时从开始到结束,都是用ret来记录进入队列进入了多少层。然后在进行回退到最初的入口,再两层for的条件下,寻找新的入口,那么能够找到几个入口,就证明有几个岛屿。

2301_80636070的博客 945
上一篇: MST模板:使用priority_queue实现的Prim算法
下一篇: UVa 10000 Longest Paths (单源最长路 - floyd or 拓扑排序)
synapse7
博客等级 码龄14年 432粉丝 701原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值