如何解决用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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。