繁体   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