我的算法是:
- 首先计算每个节点的入度,即计算该节点为其下沉的边数。
- 现在,将仅推送队列中具有 indegree==0 的那些,因为它们将首先出现在拓扑排序的图形列表中。
- 如果现在队列的起始大小为零。这意味着"Graph can't be sorted"。
- 否则我们开始排序方法。
- 如果我们在任何时候遇到超过 2 个顶点出现在队列中,这意味着“多个序列是可能的”
- 但在某些情况下,可能无法进行进一步的序列化。
- 所以我跟踪从队列中弹出(从前面删除)的节点。和他们的数目。
- 如果最后计数==节点数。并且未设置多个序列的标志,则序列是可能的“可以对图形进行排序”。
- 或者如果设置了 count== 节点数和多序列标志。我们说“多重序列是可能的”
- 如果计数!=节点数。然后“图形无法排序”
这是我的想法的实现
vector<vector<int> >list(10000); // Graph is represented as Adjacency list
void topological_sort()
{
int i,l,item,j;
k=0;
queue<int>q; // Queue
vector<int>:: iterator it;
for(i=1;i<=n;i++) // Pushing nodes those who have indegree=0
{
if(indegree[i]==0)
q.push(i);
}
l=q.size();
if(l==0)
{
flag=2; // means no sequence is possible
return;
}
while(q.empty()==0)
{
l=q.size();
if(l>1)
flag=1; // multiple sequence possible for sure but check whether this is fully possible or not
item=q.front();
q.pop();
ans[k++]=item;
for(it=list[item].begin();it!=list[item].end();it++)
{
j=*it;
indegree[j]--;
if(indegree[j]==0)
q.push(j);
}
}
if(k!=n)
flag=2; // no sequence is possible.
}
这个算法太慢了!或者只是一个幼稚的实现。对此有哪些进一步的改进。或者我如何使用 DFS 进行拓扑排序?