拓扑排序:在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。
思路:先找入度为0的节点记录下来,依次遍历他们所指向的节点并将这些节点的入度减一,再找入度为0的点重复上述步骤,重复下去,最后依次输出所记录的点(如果找不到入度为0的点则证明有环)。
优化:每一步都要找入度为0的点,暴力肯定超时,可以用优先队列
代码:
queue<int>q;
vector<int>edge[n];
for(int i=0;i<n;i++) //n 节点的总数
if(in[i]==0) q.push(i); //将入度为0的点入队列
vector<int>ans; //ans 为拓扑序列
while(!q.empty())
{
int p=q.front(); q.pop(); // 选一个入度为0的点,出队列
ans.push_back(p);
for(int i=0;i<edge[p].size();i++)
{
int y=edge[p][i];
in[y]--;
if(in[y]==0)
q.push(y);
}
}
if(ans.size()==n)
{
for(int i=0;i<ans.size();i++)
printf( "%d ",ans[i] );
printf("\n");
}
else printf("No Answer!\n"); // ans 中的长度与n不相等,就说明无拓扑序列