拓扑排序
思路
-
在一个有向图中,对所有的节点进行排序,要求没有一个节点能指向它前面的节点.
-
先统计所有点的入度,对于入度为0的节点分离出来(压入队列),然后把这个节点指向的节点入度减1.同时如果被指向的节点入度变为0,将其压入队列.
-
一直循环该操作,直到所有点都被分离出来. 如果最后不存在入度为0的点,说明有环,不存在拓扑序.
代码
int e[N],ne[N],h[N],idx;
int d[N],cnt,top[N];
queue<int> q;
// 先把所有入度为0的点压入队列
for(int i = 0;i < n;i++)
{
if(d[i] == 0) q.push(i);
}
while(q.size())
{
int t = q.front();
q.pop();
top[cnt] = t;
cnt ++;
for(int j = h[t];j != -1;j = ne[j])
{
int i = e[j];
d[i] --;
if(d[i] == 0){q.push(i);}
}
}
return cnt == n-1; // 是否能成为拓扑序咧