zoukankan      html  css  js  c++  java
  • 拓扑排序学习(复习)笔记

    拓扑排序求出的一个序列满足所有有关系((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);
    	}
    }
  • 相关阅读:
    Java: 数据类型
    数据结构是什么
    数据结构:进制转换
    数据结构:堆与栈
    class的写法
    Java:异常体系
    数据结构: 先进后出——堆栈
    tomcat:web容器
    Windows: Dos命令
    面向函数范式编程
  • 原文地址:https://www.cnblogs.com/andysj/p/13876835.html
Copyright © 2011-2022 走看看