( 图论专题 )【 拓扑排序 】
在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。
先统计所有节点的入度,对于入度为0的节点就可以分离出来,然后把这个节点指向的节点的入度减一。
一直做改操作,直到所有的节点都被分离出来。
如果最后不存在入度为0的节点,那就说明有环,不存在拓扑排序,也就是很多题目的无解的情况。
下面是算法的演示过程。
代码:
void topu()
{
queue<int> Q; // 队列只存入度为0的点
for ( int i=1; i<=n; i++ ) {
if ( in[i]==0 ) Q.push(i);
}
vector<int> ans; // 存拓扑序列
while ( !Q.empty() ) {
int t = Q.front(); Q.pop(); // 选一个入度为0的点出来
ans.push_back(t);
for ( int i=head[t]; i!=-1; i=e[i].nxt ) {
int to = e[i].to;
in[to]--; // 相连点度数--
if ( in[to]==0 ) Q.push(to);
}
}
return 0;
}
例题1:
https://blog.csdn.net/weixin_43828245/article/details/103136070
例题集: