拓扑排序求出的一个序列满足所有有关系((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);
}
}