Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么kosaraju算法有效?它背后的思想是什么?这是一个正确的实现吗?_C++_Algorithm_Graph_Connected Components_Kosaraju Algorithm - Fatal编程技术网

C++ 为什么kosaraju算法有效?它背后的思想是什么?这是一个正确的实现吗?

C++ 为什么kosaraju算法有效?它背后的思想是什么?这是一个正确的实现吗?,c++,algorithm,graph,connected-components,kosaraju-algorithm,C++,Algorithm,Graph,Connected Components,Kosaraju Algorithm,为什么我们要创建一个图的转置,然后在第二个过程中对转置运行dfs。我曾尝试在线阅读正确性证明,但不明白是否有其他方法可以做到这一点,这很容易理解 这是我的算法实现,它将顶点和边的数量作为输入,然后将定向边作为输入(顶点编号为0到n-1) #包括 使用名称空间std; void dfsForward(int src、向量g、向量和vis、堆栈和s){ vis[src]=真; 对于(int i=0;i>e; 向量g(n); 向量t(n); 对于(inti=0;i>u>>v; g[u]。推回(v);

为什么我们要创建一个图的转置,然后在第二个过程中对转置运行dfs。我曾尝试在线阅读正确性证明,但不明白是否有其他方法可以做到这一点,这很容易理解

这是我的算法实现,它将顶点和边的数量作为输入,然后将定向边作为输入(顶点编号为0到n-1)

#包括
使用名称空间std;
void dfsForward(int src、向量g、向量和vis、堆栈和s){
vis[src]=真;
对于(int i=0;i>e;
向量g(n);
向量t(n);
对于(inti=0;i>u>>v;
g[u]。推回(v);
t[v]。推回(u);
}

coutKosaraju算法分为三个简单步骤:

1.Reverse the Graph.

2. Apply DFS-Loop in Reverse Graph and calculate ordering of each vertex (we call 
   it finishig times).
3. Apply DFS-loops in Graph in descending order of finishing times.
(通过DFS循环,我指的是图G的每个顶点中的DFS)

回答你的问题:为什么我们先反转图形 步骤


正如你所知道的,图G和反向图G’中的SCC将是相同的。如果把每个SCC看作一个独立的节点,则G、G′将是一个DAG(直接非循环图)。作为DFS的一个属性,DAG中的最大完成时间总是图的同步顶点(从没有输出弧的顶点)。在本例中为N。因此,如果从该同步顶点N重新运行DFS,它将仅迭代该特定SCC(形成N)。因此,通过这种方式,您将迭代地发现图中的所有SCC。

Kosaraju算法分为三个简单步骤:

1.Reverse the Graph.

2. Apply DFS-Loop in Reverse Graph and calculate ordering of each vertex (we call 
   it finishig times).
3. Apply DFS-loops in Graph in descending order of finishing times.
(通过DFS循环,我指的是图G的每个顶点中的DFS)

回答你的问题:为什么我们先反转图形 步骤


正如你所知道的,图G和反向图G’中的SCC将是相同的。如果把每个SCC看作一个独立的节点,则G、G′将是一个DAG(直接非循环图)。作为DFS的一个属性,DAG中的最大完成时间总是图的同步顶点(从没有输出弧的顶点)。所以如果你从这个同步顶点N重新运行DFS,它只会遍历那个特殊的SCC(它形成N)。因此,通过这种方式,您将迭代地发现图表中的所有SCC。

请格式化您的问题。它不可读…抱歉,我现在尝试格式化它。您确实应该使用描述性变量名,而不是单个字母名,例如
t
g
。请格式化您的问题。它不可读…抱歉,我现在尝试格式化它。您确实应该使用描述性变量名称,而不是像
t
g
这样的单字母名称。