一:
定义:
拓扑排序: 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
入度: 在有向图中,点i的入边条数成为点i的入度;
出度: 在有向图中,点i的出边条数成为点i的出度;
若不存在入度为0的点, 则该图必为环;
二:
计算步骤:
1:找出入度为0的点放入队列;
2:将队列中的点及其所有出边消除,即对应端点入度减一;
3:重复1, 2步骤,直至图中无点;
三:
代码实现:
priority_queue<int, vector<int>, greater<int> > q;//由小到大输出点;
void Topology(){
while(!q.empty()) q.pop();
for(int i=1; i<=N; i++){
if(degree[i]==0) q.push(i);
}
vec.clear();
while(!q.empty()){
int t=q.top();
q.pop();
vec.push_back(t);
for(int i=head[t]; i!=-1; i=edge[i].next){
int v=edge[i].v;
degree[v]--;
if(degree[v]==0) q.push(v);
}
}
for(int i=0; i<vec.size(); i++){
cout << vec[i];
if(i==vec.size()-1) cout << endl;
else cout << ' ';
}
}