拓扑排序

拓扑排序

每次把当前度数为零的节点取出,然后和这个节点相连的点度数减一。

拓扑序保证了,当前这个图一定是无环的,而且以拓扑序来遍历这个图的节点,保证了遍历到当前这个点的时候这个点的前驱节点一定被遍历了,因此,在做转移的时候可以确定当前状态是最优子结构,没有后效性,并且当前这个点可以继续往后面转移信息。

bool topsort() {
    int hh = 0, tt = -1;
    for (int i = 1; i <= n; i ++ ) if (!d[i]) q[++ tt] = i; // 把入度为0的加入 
    while (hh <= tt) {
        int t = q[hh ++]; // 取队头 
        for (int i = h[t]; i != -1; i = ne[i])  {
            int j = e[i];
            if(-- d[j] == 0)    q[++ tt] = j;
        }
    }
    return tt == n - 1; // 如果所有的都入队了,证明是拓扑图 
}
//它是对有向图的顶点排成一个线性序列。就是按照某种规则将这个图的顶点取出来,这些顶点能够表示什么或者有什么联系。
//作用当前选的不需要前置东西,是最好的

从后往前遍历拓扑序,那么当前所到的点的所有后继节点一定被遍历了(状态一定被确定了),因此可以用他的后继节点来更新当前节点的信息

posted @ 2022-03-31 17:11  枉玊  阅读(33)  评论(0)    收藏  举报