拓扑排序学习(复习)笔记

拓扑排序求出的一个序列满足所有有关系(xy)的节点中,指向的(x)在前面,被指向的(y)在后面。如果完全没关系那不一定前后。

具体操作,就是先把入度为0的节点加入队列,然后对于队列中某个节点指向的节点y,它的入度减1。如果入度减到0,那么也加入队列。它处理的是有向图,可以判断是否有环(如果队列长度小于节点个数,那么有环)

拓扑排序求最长路,和普通的其实差不多。直接dis[y]=max(dis[y],dis[x]+z)即可。(可以代替SPFA,防止被卡)

伪代码如下:

for (int i = 1; i <= n; i ++ )
{
	dis[i] = -1e9;
	if (!rd[i]) qq.push(i);
}
dis[s] = 0;
while (!qq.empty())
{
	int x = qq.front(); qq.pop();
	for (int i = hd[x]; i; i = nxt[i])
	{
		int y = to[i], z = 1;
		dis[y] = max(dis[y], dis[x] + z);
		rd[y] -- ;
		if (rd[y] == 0) qq.push(y);
	}
}
posted @   andysj  阅读(88)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示