拓扑排序(Topological Sorting)

拓扑排序

拓扑排序就是对于一个有向无环图中进行排序,大致的方法是:找出图中入度为零的点,接着依次将这些点和与点相关的边删去,同时更新其他点的入度;第二次再次查找入度为零的点……不断重复直到所有点都遍历完;

我们可以用图来模拟一下:拓扑排序(Topological Sorting)_第1张图片

第一次遍历可以得到 2 是没有入度的,所以将 2 插入队列,接着,从2开始遍历,删去 (1 -> 2) , (3 -> 2) , (4 -> 2) , (5 -> 2)这几条边。

接着可得:拓扑排序(Topological Sorting)_第2张图片

显而易见 3 是没有入度的,所以将(1 -> 3) , (5 -> 3) , (4 -> 3)删去

然后就只剩:拓扑排序(Topological Sorting)_第3张图片

1,4入度都为零,将他们删去之后就可以得到这个图的拓扑序列:2 3 1 4 5

下面是拓扑排序的核心代码:

//indegree数组是用来储存第i个顶点的入度,q是一个队列,G是二维的动态数组,作为邻接表储存图
void topo() {
    for (int i = 1; i <= n; i++) { //将整个图中的入度为零的节点放入队列
        if (indegree[i] == 0) {
            q.push(i);
        }
    }
    while (!q.empty()) {
        int now = q.front();//以入度为零的节点去更新其他节点的入度,说白了就是将这个节点和与节点相关的边删去,并更新indegree
        q.pop();
        for (int i = 0; i < G[now].size(); i++) {
            int v = G[now][i];
            indegree[v]--;
            if (indegree[v] == 0) { // 再次将入度为零的点放入队列
                q.push(v);
            }
        }    
    }
}

如果看懂的话可以做一道拓扑排序的题目:《车站分级》

希望这篇文章能对你们有所帮助,如果文章有错误,欢迎在评论区指正。

你可能感兴趣的:(算法)