1

これに対する私のアルゴリズムは次のとおりです。

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

4

1 に答える 1