存储结构采用邻接链表:
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 // 存在拓扑序列