拓扑排序
-
拓扑排序可视为对图上所有顶点不重不漏的遍历,因此可采用BFS或DFS实现
-
拓扑排序的充要条件是其为DAG(有向无环图),若拓扑排序无解说明图该图不是DAG,因此可对图进行判环
-
若为无向图可看做有向图进行拓扑排序(基环树)
-
复杂度:O( V + E V+E V+E)
基于BFS的拓扑排序
无入度点优先(Kahn)
void bfs(){
queue<vertex>q;//入度为0的队列
for(int i=1;i<=n;i++)//顶点从1开始
if(!v[i].in) q.push(v[i]);
while(q.size()){
cout<<q.front().d<<' ';
int work=v[q.front().d].e;//当前工作指针,用于遍历所有依附于该点的边
while(work!=-1){
v[e[work].t].in--;
if(!v[e[work].t].in) q.push(v[e[work].t]);
work=e[work].n;
}
q.pop();
}
}
扩展:求字典序的拓扑序
将Kahn算法中的队列换为优先队列即可。
无出度点优先
基于DFS的拓扑排序