对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。 通俗点就是:按一定条件进行排序,完成前提条件才可以进行后面事件 (如:在日常工作中,可能会将项目拆分成A、B、C、D四个子部分来完成,但A依赖于B和D,C依赖于D。为了计算这个项目进行的顺序,可对这个关系集进行拓扑排序,得出一个线性的序列,则排在前面的任务就是需要先完成的任务。) 注意:这里得到的排序并不是唯一的!就好像你早上穿衣服可以先穿上衣也可以先穿裤子,只要里面的衣服在外面的衣服之前穿就行。
使用队列就可以了
queue<int>q; ///priority_queue<int,vector<int>,greater<int>>q; ///优先队列的话,会按照数值大小有顺序的输出 ///此处为了理解,暂时就用简单队列 inttopo() { for(inti=1; i<=n; i++) { if(indegree[i]==0) { q.push(i); } } inttemp; while(!q.empty()) { temp=q.front();///如果是优先队列,这里可以是top() printf("%d->",temp); q.pop(); for(inti=1; i<=n; i++) ///遍历从temp出发的每一条边,入度-- { if(map[temp][i]) { indegree[i]--; if(indegree[i]==0)q.push(i); } } } }