Algorithm 返回有向图的源节点

Algorithm 返回有向图的源节点,algorithm,pseudocode,Algorithm,Pseudocode,有向图中的源是一个没有边的节点。给出一个线性时间算法 以邻接列表格式的有向图作为输入,并输出其所有源 解决方案: 寻找有向图的源。 我们将在[u]中保留一个数组,该数组保存每个节点的传入边的独立数量。暂时 来源,此值为零 function sources(G) Input: Directed graph G = (V,E) Output: A list of G's source nodes for all u ∈ V : in[u] = 0 for all u ∈ V : for al

有向图中的源是一个没有边的节点。给出一个线性时间算法 以邻接列表格式的有向图作为输入,并输出其所有源

解决方案:

寻找有向图的源。 我们将在[u]中保留一个数组,该数组保存每个节点的传入边的独立数量。暂时 来源,此值为零

function sources(G)
Input: Directed graph G = (V,E)
Output: A list of G's source nodes
for all u ∈ V : in[u] = 0
for all u ∈ V :
    for all edges (u,w) ∈ E:
      in[w] = in[w] + 1

L = empty linked list
for all u ∈ V :
    if in[u] is 0: add u to L
return L
关于上面的代码,我特别不理解的是第一个代码块中最内层的for循环in[w]=in[w]+1到底意味着什么?我想这意味着它要计算每个节点的索引,但是它到底是怎么做的,我无法描绘它,有人能帮我想象一下这方面吗?

in[w]=in[w]+1增加了进入w的边的数量

也许举个例子会有所帮助:

考虑一个简单的图表:

a ---> b
邻接列表表示为:

a: {b}
b: {}
现在,该算法将遍历所有顶点

对于a,它将在边a、b上循环并增加b的计数

对于b,没有边

现在a的计数仍然为零,因此它是一个源顶点。

in[w]=in[w]+1增加进入w的边数

也许举个例子会有所帮助:

考虑一个简单的图表:

a ---> b
邻接列表表示为:

a: {b}
b: {}
现在,该算法将遍历所有顶点

对于a,它将在边a、b上循环并增加b的计数

对于b,没有边


现在a的计数仍然为零,因此它是一个源顶点。

它在所有边u->w上循环,并增加w节点的索引。你不明白什么?为什么特别是w节点而不是u节点?这是怎么回事?边是从u到w的定向边。我们要计算节点的传入边数。“传入”边为零的节点是我们的源节点。伪代码中的缩进具有误导性。第二个是美国∈ V循环没有嵌套到第一个节点中。它在所有边u->w上循环,并增加w节点的索引。你不明白什么?为什么特别是w节点而不是u节点?这是怎么回事?边是从u到w的定向边。我们要计算节点的传入边数。“传入”边为零的节点是我们的源节点。伪代码中的缩进具有误导性。第二个是美国∈ V循环未嵌套到第一个循环中。