簡體   English   中英

優化算法以檢查“對於給定的有向圖是否只有一種方法使用拓撲排序對圖形進行排序”

[英]Optimization on Algorithm to check “Whether for a given directed graph there is only one way to sort the graph using topological sort or not”

我的算法是:

  1. 首先計算每個節點的Indegree,即該節點為它們接收的邊數的計數。
  2. 現在,將僅推送具有indegree == 0的隊列中的那些,因為這些將是第一個出現在拓撲排序的圖表列表中。
  3. 如果現在隊列的起始大小為零。 這意味着“圖表無法排序”
  4. 否則我們開始排序方法。
  5. 如果我們遇到隊列中任何時候存在超過2個頂點,這意味着“多個序列是可能的”
  6. 但可能存在進一步序列可能無法實現的情況。
  7. 所以我跟蹤從隊列中彈出(從Front刪除)的節點。 並計算他們。
  8. 如果最后計數==節點數。並且未設置多個序列的標志,則序列可以“圖表可以被排序”。
  9. 或者如果count ==節點數和多個序列的標志被設置。 我們說“多序列是可能的”
  10. if 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對此進行拓撲排序?

定理:
有向圖具有唯一的拓撲排序,當且僅當它是有向鏈時。

證據留給你作為鍛煉


要確定有向圖是否具有唯一的拓撲排序,您所要做的就是:

  1. 找到任意度為0的節點
    • 如果沒有,則圖形具有循環, 並且沒有唯一的拓撲排序
  2. 重復跟隨當前節點的第一個外邊緣,將訪問的節點添加到集合中
  3. 停止時間:
    • 您到達已訪問過的節點 - 圖形具有循環,因此它沒有唯一的拓撲排序
    • 到達死胡同 - 當且僅當受訪節點集包含圖中的所有節點時,圖才具有唯一的拓撲排序

您的代碼似乎沒有遵循這種簡單的方法。 (如果我錯了,請糾正我!)因此,我建議只使用上面的算法大綱,而不是試圖弄清楚你的代碼是否正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM