拓扑排序原理:https://blog.csdn.net/summer_dew/article/details/81604206
逆拓扑排序
- 从有向图中选择一个出度为0的顶点输出
- 删除1中的顶点,并且删除指向该顶点的全部边
- 重复上述两步,直到剩余的图中不存在出度为0的顶点为止
求法
方法一:拓扑排序修改
拓扑排序修改中进行修改,将入度改成出度即可
方法二:深度优先遍历的方法
【原理】由于图中无环,当由图中某顶点出发进行DFS,最先退出算法的顶点即为出度为0的顶点,它是拓扑有序序列中的最后一个顶点
- 最先退出算法的顶点即是出度为0的顶点(先退出来的顶点没有邻边):退出算法指所遍历的顶点退出当前系统栈
- 按照DFS算法先后次序并不是指最终遍历结果序列,而是顶点退出系统栈的顺序
【例子】图{A->B,A->C,B->D,C->D}的DFS过程
操作 | 栈中元素 | 出栈元素 |
---|---|---|
A入栈 | A | |
B入栈 | AB | |
D入栈 | ABD | |
D出栈 | AB | D |
B出栈 | A | DB |
C入栈 | AC | DB |
C出栈 | A | DBC |
A出栈 | DBCA |
- 因此,各个元素出栈先后序列为DBCA,为拓扑序列ACBD的逆拓扑序列
【实现】结点没有边的时候输出 –> 输出的是从尾到头的序列 –> 逆拓扑序列
void DFS(int v, ALGraph *pG) {
visit[v] = 1;
ArcNode *q = pG->vers[v].firstarc;
while (q!=NULL) {
if (visit[q->adjV]==0)
DFS(q->adjV, pG);
q=q->next;
}
Visit(v); //v的邻边都被访问过了,再输出
//第一个输出的,就是v没有邻边-->即末端的结点
}