前言
拓扑排序。是将一个有向无环图,转化成偏序关系的一种算法,
操作:
一、算法原理
从待排序集合中,取出入度为零的点(没有点能比入度为零的点大)。删去与这个点相关的所有边,使这个点从关系网中退出。重复上述操作直至只剩一个点为止。
总之就是让点按从大到小的顺序退出关系网,来不断分解关系网。
所以算法关键在与如何快速找到入度为0的点。
二、操作
1,从所有待排序集合,中取出所有入度为零的点,加入到队列中。
2.从队列中取出任意取出一个点,将这个点的所有边,从关系网中删除
3.将删除过程中,入度变成零的点,加入队列。(这步重要,利用了新的入度为零的点只由能删除操作产生,)
4.重复2-3的操作直至队列为空。
显然算法的总复杂度只与要删除的边的个数有关。所以是O(E+N)的。
三、算法模板
while (m--)
{
int u, v;
scanf("%d%d", &v, &u);
enter[v]++;
e[u].push_back(v);
}
queue<int> q;
for (int i = 1; i <= n; i++)
{
if (!enter[i])
q.push(i);
}
int cnt = 0;
while (!q.empty())
{
int u = q.front();
q.pop();
cnt++;
for (int i = 0; i < e[u].size(); i++)
{
int v = e[u][i];
if (--enter[v] == 0)
{
q.push(v);
//这里可以加入相对操作
}
}
}