拓扑排序
定义:对一个 有向无环图 进行拓扑排序,是将G中的所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边< u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为 拓扑排序(其实我觉得不简单了…)。
算法思路:
拓扑排序算法主要由以下两步循环执行,直到不存在入度为0的顶点为止。
1. 选择一个入度为0的顶点并将它输出;
2. 删除图中从顶点连出的所有边。
循环结束,若输出的顶点数小于图中的顶点数,则表示该图中存在回路,也就是无法进行拓扑排序;否则输出的顶点序列就是一个拓扑序列。
模板代码:
就是要用链式前向星、队列、一个需要根据输入赋值的indegree[MAX_N]数组记录每个节点的入度。
struct edge {
int v, next;
} e[MAX_M];
int p[MAX_N], eid;
int topo() {
queue<int> q;
for (int i = 1; i <= n; i++) {
if (indegree[i] == 0) { // 将所有入度为零的顶点入队
q.push(i);
}
}
while (!q.empty()) {
int now = q.front();
cout << "visiting " << now << endl;
q.pop();
for (int i = p[now]; i != -1; i = e[i].next) {
int v = e[i].v;
indegree[v]--;
if (indegree[v] == 0) { // 将入度新变成零的顶点入队
q.push(v);
}
}
}
}