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

拓扑排序求出的一个序列满足所有有关系((x ightarrow{y}))的节点中,指向的((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);
	}
}
原文地址:https://www.cnblogs.com/andysj/p/13876835.html