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

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(拓扑排序,多种最短路算法) 算法知识之图论(拓扑排序,多种最短路算法) 阅读详情

相关推荐

当兵心理测试软件,当兵心理测试题及答案

心理测试是一种比较先进的测试方法,它是指通过一系列手段,将人的某些心理特征数量化,来衡量个体心理因素水平和个体心理差异差异的一种科学测量方法。小编为你整理了当兵心理测试题及答案,希望对你有所参考帮助。征兵心理测试题(1代表是2代表否)1、我的胃口很好。12、我早上起来的时候,多半觉得睡眠充足,头脑清醒13、我喜欢看报纸上的犯罪新闻。14、有时我常感到困难重重,无法克服。25、我时常遇见一些所谓的专...

weixin_42128393的博客 1万+

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

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

VLOKL的博客 1701

【HDR】曝光融合(Exposure Fusion)

在曝光融合(Exposure Fusion)算法问世之前,多曝光序列合成用于显示的HDR需要两个步骤,第一步是将多张不同曝光的低动态范围图像合成为HDR(例如Debevec提出的加权融合方法),通常HDR为12bit或者16bit;第二步是通过tonemapping对高动态范围HDR进行压缩以支持低动态范围显示设备(例如Durand提出的基于双边滤波的tonemapping算法),一般会压缩至8bit。

专注人工智能,主攻CV 1万+

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

图论模板一、拓扑排序题意代码二、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

多元相关性分析_PAST:最简便易用的统计学分析软件教程目录

欢迎来到PAST的世界!本教程并不是将PAST的所有功能均进行详细介绍,而只是挑选与生物、医学、微生物研究相关的统计学分析内容进行讲述。根据PAST内各项分析的标签分类,将该教程具体设置如下:PAST软件介绍PAST的基本信息数据的输入和修改数据的转换和标准化图像绘制 (Plot标签)点线图和直方图散点图条形图和箱须图饼图堆叠条形图三元相图气泡图单变量统计学分析 (Univariate标...

weixin_39605706的博客 3156

ArcGIS Pro实战:用时空立方体分析共享单车轨迹数据(含3D可视化技巧)

本文详细介绍了在ArcGIS Pro中利用时空立方体技术分析共享单车轨迹数据的全流程。从数据预处理、构建时空立方体,到执行新兴时空热点分析,并最终实现动态3D可视化,手把手教你挖掘城市骑行活动的时空规律。文章重点解析了工具参数设置、常见报错解决方案,并提供了可复用的Python脚本,助力城市规划与交通研究者高效完成时空模式挖掘。

weixin_28323057的博客 137

有向无环图的最短路径

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

ac@zhui的博客 2683

Spring Boot 3.5.4 + LangChain4j实战:用Milvus搭建企业级RAG问答系统(附阿里百炼API配置)

本文详细介绍了如何利用Spring Boot 3.5.4、LangChain4j与Milvus构建企业级RAG问答系统。内容涵盖从架构设计、阿里百炼API安全配置、Milvus部署优化,到RAG检索、会话管理等核心实现,并提供了生产级API设计、监控集成及性能优化等实战经验,旨在帮助开发者打造高可用、可维护的Java AI应用。

weixin_29054399的博客 610

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

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

a1046765624的博客 686

Python爬虫实战:从巨潮网批量抓取上市公司年报JSON数据

网络爬虫作为自动化数据采集的核心技术,其原理是通过模拟浏览器行为向服务器发送HTTP请求并解析响应,从而高效获取结构化信息。在金融数据分析领域,这项技术价值尤为突出,能够将研究人员从繁琐的手工数据收集中解放出来,聚焦于更高阶的模型构建与价值挖掘。典型的应用场景包括上市公司财务研究、市场趋势分析和风险预警系统开发。本文以Python的requests库为核心工具,详细解析如何通过分析巨潮资讯网的JSON数据接口,构建一个稳定、高效的上市公司年报数据采集管道,并重点探讨了接口逆向、分页爬取、PDF文件下载等关键

weixin_42529366的博客 1236

73、结合无人机进行rk3588oak-lite跟踪目标物体进行识别、跟踪

搭建仿真转换模型环境,主要python版本和我下载的rknn2的版本。截取shape节点,输出模型。so库也要对应转模型的whl。其中安装的whl版本。

sxj731533730 1623

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

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

叶落秋白的博客 3641

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

2401_86619696的博客 2275

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

利用拓扑排序求 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 930

jre9下载 jdk9

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

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

单源最短路径问题(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、付费专栏及课程。

余额充值