これに対する私のアルゴリズムは次のとおりです。
- まず、すべてのノードの Indegree を計算します。つまり、このノードがシンクするエッジの数をカウントします。
- ここで、indegree==0 を持つもののみをキューにプッシュします。これは、グラフのトポロジカル ソート リストに最初に表示されるためです。
- キューの開始サイズがゼロの場合。つまり、「グラフを並べ替えることができません」という意味です。
- それ以外の場合は、並べ替えメソッドを開始します。
- 常に 2 つ以上の頂点がキューに存在する場合、それは「複数のシーケンスが可能」であることを意味します。
- ただし、それ以上のシーケンスが不可能な場合があります。
- そのため、Queue からポップした (Front から削除された) ノードを追跡します。そしてそれらの数も。
- 最後に count==number of nodes.and 複数シーケンスのフラグが設定されていない場合、シーケンスは「グラフをソートできます」可能です。
- または count== ノード数と複数シーケンスのフラグが設定されている場合。私たちは「複数のシーケンスが可能です」と言います
- 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を使用してトポロジカルソートを使用するにはどうすればよいですか?