拓扑排序实现代码:
vector<int >G[maxv];//邻接表
int n,m,inDegree[maxv];//顶点数,入度
bool topologicalSort(){
int num = 0;//记录加入拓扑序列的顶点数
queue<int > q;
for(int i = 0;i < n;i++){
if(inDegree[i] == 0){
q.push(i); // 将所有入度为0的顶点入队
}
}
while(!q.empty()){
int u = q.front(); //取队首顶点
//printf("%d",u); //此处可输出顶点u,作为拓扑排序中的顶点
q.pop();
for(int i = 0;i < G[u].size();i++){
int v = G[u][i]; //u的后继结点v
inDegree[v]--; //顶点v的入度减 1
if(inDegree[v] == 0){ //顶点v的入度减为0则入队
q.push(v);
}
}
G[u].clear();//清空顶点u的所有边
num++;//加入拓扑序列的顶点数加 1
}
if(num == n) return true;//加入拓扑排序的顶点数为n,说明拓扑排序成功
else return false; //加入拓扑序列的顶点数小于n,说明拓扑排序失败
}
拓扑排序的很重要的应用是判断一个给定的图是否是有向无环图,当上面实现的拓扑排序返回 true ,则说明拓扑排序成功,给定的图为有向无环图;否则,说明拓扑排序失败,给定的图有环。