如何获得拓扑排序的所有解决方案

穆斯塔法

大家好,我正在尝试解决此问题http://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=813,我意识到它想获取拓扑排序问题的所有解决方案,我知道如何仅获得一种可能的解决方案,这是我的代码http://ideone.com/IiQxiu

static ArrayList<Integer> [] arr;  
static int visited [];
static Stack<Integer> a = new Stack<Integer>();
static boolean flag=false;

public static void graphcheck(int node){  //method to check if there is a cycle in the graph
    visited[node] = 2;
    for(int i=0;i<arr[node].size();i++){
        int u =arr[node].get(i);
        if(visited[u]==0){
            graphcheck(u);
        }else if(visited[u]==2){
                flag=true;
                return; 
            }
    }
    visited[node] = 1;
}

public static void dfs2(int node){            //method to get one possible topological sort which I want to extend to get all posibilites
    visited[node] = 1;
    for(int i=0;i<arr[node].size();i++){
        int u =arr[node].get(i);
        if(visited[u]==0){
            dfs2(u);
        }   
    }
    a.push(node);
}

public static void main(String[] args) throws NumberFormatException, IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int tc = Integer.parseInt(br.readLine());
    for(int k=0;k<tc;k++){
        br.readLine();

        String h[]= br.readLine().split(" ");
        int n= h.length;
        arr=new ArrayList[n];
        visited = new int[n];
        for( int i = 0; i < n; i++) {
            arr[ i] = new ArrayList<Integer>();
        }
        String q[]=br.readLine().split(" ");
        int y=q.length;
        for(int i=0;i<y;i++){
            int x=0;
            int z=0;
            for(int j=0;j<n;j++){
                if(q[i].charAt(0)==h[j].charAt(0)){
                    x=j;
                }else if(q[i].charAt(2)==h[j].charAt(0)){
                    z=j;
                }
            }
            if(q[i].charAt(1)=='<'){
                        arr[x].add(z);
            }
        }
        for(int i=0;i<n;i++){
            if(visited[i]==0)
                graphcheck(i);
        }
        if(flag){
            System.out.println("NO");
        }else{
        a.clear();
        Arrays.fill(visited, 0);
        for(int i=0;i<n;i++){
            if(visited[i]==0){
                dfs2(i);
            }   
        }
        int z= a.size();
        for(int i=0;i<z;i++){
            int x =a.pop();
            System.out.print(h[x]+" ");
        }
        System.out.println();
    }


}
}
爵士乐

一种可能的方法是修改由Khan(1962)指定的算法,其中使用以下算法来计算拓扑排序:

L←将包含已排序元素的空列表

S←没有输入边的所有节点的集合

当S为非空时

   remove a node n from S

   insert n into L

   for each node m with an edge e from n to m do

      remove edge e from the graph

       if m has no other incoming edges then

           insert m into S

如果图有边,则

   return error (graph has at least one cycle)

其他

   return L (a topologically sorted order)

这将计算一种拓扑排序,以便生成所有可能的排序。为了获得所有可能的排序,您可以将结果视为一棵树,其中根是第一个节点,节点的每个子节点是下一个值之一。给定一个图:

    1 -> 3 -> 8 
    |    |    |
    |    v    |
    |    7    |
    |     \   |
    |      \_ v
    +--> 5 -> 9

这棵树可能看起来像:

        1
       / \
      3   5
     /|\  |
    7 8 9 9
    | |
    9 9

但是,重新阅读您的问题后:

给定形式为A <B的变量约束列表,您将要编写一个程序,该程序打印出与约束一致的所有变量排序。例如,给定约束A <B和A <C,变量A,B和C有两种与这些约束一致的顺序:ABC和ACB。

我认为该解决方案不会为您提供所需的答案,但是非常欢迎您尝试并实施它。

还要检查这个算法

注意:

在重新阅读您的问题后,我将不发布此信息,但是我决定反对,因为此信息可能对您有用。

祝好运。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何获得拓扑排序的所有解决方案

来自分类Dev

如何获得解决方案项目中的所有类型?

来自分类Dev

使用minisat查找SAT的所有解决方案

来自分类Dev

如何为所有解决方案将EditorConfig文件导入Visual Studio?

来自分类Dev

有解决方案吗?

来自分类Dev

如何通过Django渠道共享文件,现在有不完整的解决方案,例如S3存储桶中的所有解决方案

来自分类Dev

哈希难题表示法可解决带有Prolog限制的所有解决方案

来自分类Dev

没有项目\ bin \配置的所有解决方案输出的MSBuild复制任务

来自分类Dev

C#VisualStudio 2015如何从现有解决方案到新解决方案中使用代码

来自分类Dev

如何获得解决方案中的所有项目名称?

来自分类Dev

重复进行部分排列。列出所有解决方案算法

来自分类Dev

权限被拒绝(公钥)(尝试其他所有解决方案)

来自分类Dev

试图在python中使用Z3查找布尔公式的所有解决方案

来自分类Dev

重复进行部分排列。列出所有解决方案算法

来自分类Dev

为什么VS build自动化会获取所有解决方案文件?

来自分类Dev

使用\ n \以矩阵形状打印所有解决方案

来自分类Dev

如何在现有解决方案中将项目添加到源代码管理

来自分类Dev

关于如何使用Excel SUMIFS和TEXT作为日期有解决方案吗?

来自分类Dev

确定同余系统是否有解决方案

来自分类Dev

Unity Project没有解决方案文件

来自分类Dev

有解决方案来避免LazyInitializationException

来自分类Dev

提取粗体字,有解决方案吗?

来自分类Dev

如何使一个递归解决方案返回所有可能的解决方案?

来自分类Dev

Numpy的矩阵解决方案:没有解决方案?

来自分类Dev

Maxima解决方案没有解决方案

来自分类Dev

如何将所有解决方案项目.Net Framework 4.5.1升级到4.8 Visual Studio 2019

来自分类Dev

在更新按钮java上发生NullPointerException。尝试了所有解决方案,但没有运气

来自分类Dev

如何获取标记为Tag1 AND Tag2 AND ...的所有商品,以获得3桌标签解决方案

来自分类Dev

Python Pip安装错误:找不到vcvarsall.bat。尝试了所有解决方案

Related 相关文章

  1. 1

    如何获得拓扑排序的所有解决方案

  2. 2

    如何获得解决方案项目中的所有类型?

  3. 3

    使用minisat查找SAT的所有解决方案

  4. 4

    如何为所有解决方案将EditorConfig文件导入Visual Studio?

  5. 5

    有解决方案吗?

  6. 6

    如何通过Django渠道共享文件,现在有不完整的解决方案,例如S3存储桶中的所有解决方案

  7. 7

    哈希难题表示法可解决带有Prolog限制的所有解决方案

  8. 8

    没有项目\ bin \配置的所有解决方案输出的MSBuild复制任务

  9. 9

    C#VisualStudio 2015如何从现有解决方案到新解决方案中使用代码

  10. 10

    如何获得解决方案中的所有项目名称?

  11. 11

    重复进行部分排列。列出所有解决方案算法

  12. 12

    权限被拒绝(公钥)(尝试其他所有解决方案)

  13. 13

    试图在python中使用Z3查找布尔公式的所有解决方案

  14. 14

    重复进行部分排列。列出所有解决方案算法

  15. 15

    为什么VS build自动化会获取所有解决方案文件?

  16. 16

    使用\ n \以矩阵形状打印所有解决方案

  17. 17

    如何在现有解决方案中将项目添加到源代码管理

  18. 18

    关于如何使用Excel SUMIFS和TEXT作为日期有解决方案吗?

  19. 19

    确定同余系统是否有解决方案

  20. 20

    Unity Project没有解决方案文件

  21. 21

    有解决方案来避免LazyInitializationException

  22. 22

    提取粗体字,有解决方案吗?

  23. 23

    如何使一个递归解决方案返回所有可能的解决方案?

  24. 24

    Numpy的矩阵解决方案:没有解决方案?

  25. 25

    Maxima解决方案没有解决方案

  26. 26

    如何将所有解决方案项目.Net Framework 4.5.1升级到4.8 Visual Studio 2019

  27. 27

    在更新按钮java上发生NullPointerException。尝试了所有解决方案,但没有运气

  28. 28

    如何获取标记为Tag1 AND Tag2 AND ...的所有商品,以获得3桌标签解决方案

  29. 29

    Python Pip安装错误:找不到vcvarsall.bat。尝试了所有解决方案

热门标签

归档