拓扑排序只适用于有向图,判断有没有环、排序任务或者上课的顺序。
拓扑排序:根据节点间的连接关系进行线性排序,基础的拓扑排序实现可参考这篇博客内容 。算法思想:
- 选取满足条件的节点加入队列&栈结构的容器中,
- 对容器中的每个节点,将节点排出容器,
- 将与其相联,且满足一定关系的节点选出加入容器中,
- 重复上述过程直至容器中再无节点,
- 节点进入容器的顺序即为拓扑拍戏
基于栈实现的拓扑排序
stack<int> q;
for (int i = 1; i <= n; i ++)
{
if (in[i] == 1)
q.push(i); //满足一定关系,则加入容器
}
while (!q.empty()) //容器若不为空
{
int p = q.top();
q.pop();
for (int i = 0; i < st[p].size(); i ++) //与排除容器节点相联的节点——检查,若满足条件则加入容器
{
in[st[p][i]] --;
if (in[st[p][i]] == 1)
{
q.push(st[p][i]);
}
}
gt[k ++] = p; //节点进入容器的顺序即拓扑排序
}
基于队列实现的拓扑排序
queue<int> q;
for (int i = 1; i <= n; i ++)
{
if (in[i] == 1)
q.push(i); //满足一定关系,则加入容器
}
while (!q.empty()) //容器若不为空
{
int p = q.front();
q.pop();
for (int i = 0; i < st[p].size(); i ++) //与排除容器节点相联的节点——检查,若满足条件则加入容器
{
in[st[p][i]] --;
if (in[st[p][i]] == 1)
{
q.push(st[p][i]);
}
}
gt[k ++] = p; //节点进入容器的顺序即拓扑排序
}
以上两种实现方法的代码是完全相同的,可这代表两种实现方法的功能也是相同的吗?拓扑排序是一种很好的抽象图的算法,可以以少量的时间复杂度与空间抽取图的关键信息,对于两种实现方法,抽取关键信息的结构是有所不同的,毕竟一个是栈存储中间信息,一个是队列存储中间信息。面对不同的拓扑排序结构,有的结构两种实现方法的拓扑排序功效相同,有的则会不同,所以应用哪种方法实现拓扑排序结构的功能还是要认真考虑的。