[图] 7.2 逆拓扑排序 - C实现 - DFS方法

拓扑排序原理:https://blog.csdn.net/summer_dew/article/details/81604206

逆拓扑排序

  1. 从有向图中选择一个出度为0的顶点输出
  2. 删除1中的顶点,并且删除指向该顶点的全部边
  3. 重复上述两步,直到剩余的图中不存在出度为0的顶点为止

求法

方法一:拓扑排序修改

拓扑排序修改中进行修改,将入度改成出度即可

方法二:深度优先遍历的方法

【原理】由于图中无环,当由图中某顶点出发进行DFS,最先退出算法的顶点即为出度为0的顶点,它是拓扑有序序列中的最后一个顶点

  1. 最先退出算法的顶点即是出度为0的顶点(先退出来的顶点没有邻边):退出算法指所遍历的顶点退出当前系统栈
  2. 按照DFS算法先后次序并不是指最终遍历结果序列,而是顶点退出系统栈的顺序

【例子】图{A->B,A->C,B->D,C->D}的DFS过程

操作栈中元素出栈元素
A入栈A
B入栈AB
D入栈ABD
D出栈ABD
B出栈ADB
C入栈ACDB
C出栈ADBC
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没有邻边-->即末端的结点
}
    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/summer_dew/article/details/83044629
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞