拓扑排序

存储结构采用邻接链表:

int value[m], next[m], head[n], d = 0;

memset(head, -1, sizeof(head));

拓扑排序的思想是,每次将图中所有入度为0的顶点删除,直到顶点全部删完或者找不到顶点入度为0,如果能够将顶点全部删完,则入队顺序就是拓扑序列,如果还有结点但是入度都不为0,则不存在拓扑序列

顶点i的入度为in[i],每添加一条指向b的边,就要将in[b]++

int in[n];

拓扑排序采用队列实现(类似BFS的实现方法),这里将队列容量n开到足够大,既可以避免循环队列的取模操作(详见:队列),又可以在queue[0...n-1]中得到拓扑序列

int queue[n], front = 0, rear = 0;
for (int i = 0; i < n; i++)
    if (!in[i]) queue[rear++] = i;

while (front < rear) {
    int t = queue[front++];
    for (int i = head[t]; i != -1; i = next[i]) {
        int j = value[i];
        if (!--in[j]) queue[rear++] = j;
    }
}

最后检查一下是否所有顶点都入过队,是的话说明有拓扑序列为queue[0...n-1],否则没有拓扑序列

rear == n // 存在拓扑序列