用Kosaraju算法构造内核DAG

问题描述

我目前正在学习Kleinberg和Tardos的《算法设计》一书中展示的不同算法。我已经完成了Kosaraju-Sharir算法的实现,现在我正在尝试基于强连接的组件构造内核DAG。我不确定如何实现将执行此操作的代码。当前,我有一种名为display的方法,该方法将打印牢固连接的组件,并且我希望它也能够打印Kernel DAG。在此代码中,相邻的是我的邻接表,并且已经在反向邻接表上执行了DFS。变量“ kern”只是初始邻接表的副本,它以下面所示的格式输入。我希望输出内核DAG看起来类似,在具有边缘的强连接组件旁边打印强连接组件1(例如SCC2 SCC4)。

1 0 
0 2 
2 1 
0 3 
3 4

具有给定输入的以下方法的输出如下所示:

The given graph has 3 Strongly Connected Components.
Connected Component #0: [4]
Connected Component #1: [3]
Connected Component #2: [0,2,1]
public static void display (ArrayList<ArrayList<Integer>> adjacent,ArrayList<ArrayList<Integer>>kern)
    {
        Iterator<ArrayList<Integer>> temp = adjacent.iterator();
        int size = adjacent.size();

        System.out.println("\nThe given graph has " + size + " Strongly Connected Components.");
        for(int i = 0; temp.hasNext(); i++)
        {

            ArrayList<Integer> x = temp.next();
            System.out.println("Connected Component #"+i + ":\t" + x);
        }
        System.out.println(kern);
    }

我已尝试为此问题编写伪代码。我知道,因为我有牢固连接的组件,所以我可以创建一个for循环,该循环将遍历各个牢固连接的组件中的每个顶点,并在原始邻接表中查找将其连接到另一个SCC的边。另外,我认为最好是实施一个哈希表来存储内核DAG,然后在打印之前检查该哈希表是否存在重复项。那将是创建内核DAG的最好,最干净的方法吗?还是我缺少一个更好的解决方案?

解决方法

是的,这是多余的,但这将是检查边缘的唯一方法。 使用拓扑排序将减少时间复杂度,如果您确实使用拓扑排序,则不必担心重复。

您可以参考下面的方程式以及有关Graph Kernels的提示。 https://cs.uwaterloo.ca/~y328yu/mycourses/480-2018/assignments/a3/hw3.pdf

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...