思维导图:
拓扑排序的定义:
拓扑排序的算法思想:
ps: 拓扑排序不一定唯一
拓扑排序的代码实现:
bool ToplogicalSort(Graph G){
InitStack(s); //当出现多个入队为0的顶点时入栈保存
for(int i=0;i<G>vexnum;i++)
if(indegree[i] == 0) //保存所有顶点当前的入度
push(S,i);
int count = 0; //当前访问的顶点的个数
while(!isEmpty(s)){ //不为空
Pop(s,i);
print[count++] = i; //保存拓扑序列大的数组
for(p = G.Vertices[i].firstarc;p;p = nextarc){ //遍历边表
v = p->adjvex;
if(!(--indegree[v])) //删除一个顶点后让其相邻顶点入度减一,若减一之后为0,则入栈
Push(s,v);
}
}
if(count < G>vexnum) //是否访问了全部节点
return false;
else
return true;
}
//时间复杂度:O(|V|+|E|)
拓扑排序的特点:
逆拓扑排序:
PS:
用邻接矩阵优于邻接表
用DFS算法实现逆拓扑排序:
bool visited[MAX_TRUE_SIZE];
void DFSTraverse(Graph G){
for(int i=0;i<G.vexnum;++i)
visited[i] = false;
for(int i=0;i<G.vexnum;++i)
if(!visited[i])
DFS(G,i);
}
void DFS(Graph G,int v){
visit(v);
visited[v] = true;
for(w = FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
if(!visited[w])
DFS(G,w);
print(v);
}