一、知识储备
1.优先队列
2.邻接表构造图
二、核心算法
利用队列储存入度为0的节点,出队,放入拓扑序列,然后遍历该节点的单链表,将该节点所有后续节点的入度-1,直到出现入度=0的节点,即可加入拓扑序列,就将其入队,循环下去。
using namespace std;
const int MAXN = 100;
vector<int> graph[MAXN];
int inDegree[MAXN];//记录每个顶点的入度
vector<int> TopologicalSort(int n){
vector<int> topology; //存储最终拓扑序列
priority_queue<int ,vector<int>,greater<int>> node;
for (int i = 0; i < n; ++i) {
if (inDegree[i] == 0){//初始入度为0
node.push(i);//入队
}
}
while (!node.empty()){
int u = node.top();//取出队头
node.pop();
topology.push_back(u);
//更新以u为入度的顶点v的入度数,若更新后为0,进入入度为0的队列
for (int i = 0; i < graph[u].size(); ++i) {
int v = graph[u][i];
inDegree[v]--;
if (inDegree[v]==0){
node.push(v);
}
}
}
return topology;
}