algorithm - 计算图的总度数

标签 algorithm graph pseudocode

在有向图中,节点的总度数是进入它的边数加上离开它的边数。给出一个线性时间算法,将一个有向图(一如既往的邻接表格式)作为输入,并计算每个节点的总度数。算法的输出应该是一个数组 total[.],每个节点都有一个条目。

这是我针对这个问题的伪代码:

procedure total degree(G)
Input: Directed graph G=(V,E)
Output: array total[.] with an entry for each node

for all u in V in[u]=0
for all u in V:    
    for all (u,v) in E:
        in[v]=in[v]+1

for all u in V out[u]=0
for all u in V:
    for all (u,v) in E:
        out[u]=out[u]+1 

for all u in V total[u]=0
for all u in V:
    total[u]=in[v]+out[u]
return total[u]

有人能同意我做对了吗?或者如果我犯了错误,我需要改正什么,我真正不确定的是我是否做对了 outdegrees (out[.])

我使用此代码作为引用点来提出我自己的:

function sources(G)
Input: Directed graph G = (V;E)
Output: A list of G's source nodes
for all u in V : in[u] = 0
for all u in V :
    for all edges (u,w) in E:
        in[w] = in[w] + 1
L = empty linked list
for all u in V :
    if in[u] is 0: add u to L
return L 

最佳答案

第二个 for block 与第一个相同,唯一的区别是数组名称。这意味着它将计算与第一个边相同的边,从而给您一个错误的结果。

在你的第二个 for 中,你需要计算另一条边,而不是同一条边:

for all u in V out[u]=0
for all u in V:
    for all (u,v) in E:
        out[v]=out[v]+1 

或者,您可以一次将它们数完:

假设输入 G=(V,E) 是一个节点列表 (V) 和一个边列表 (E) 表示通过节点对 ((u, v)),并假设重复项应该计算在内,您需要做的就是计算边列表中的节点(包括出入节点)。

for all u in V
    total[u] = 0

for all (u, v) in E
    total[u] = total[u] + 1
    total[v] = total[v] + 1

return total

关于algorithm - 计算图的总度数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20135616/

相关文章:

java - 在 O(logn) 运行时间内遍历数组?

c++ - C++中2个64位数字的乘法

R - 在过滤不需要的数据后自动从多个 csv 文件创建散点图

loops - 伪代码中的乘法次数

machine-learning - 这是跳棋 Q-Learning 的正确实现吗?

python - 重新访问 A* 搜索中访问过的节点

algorithm - 如何在 Unity 中对齐 "tracks"或模块化对象?

algorithm - 区域分配问题

c++ - 磁盘调度程序 SCAN 算法错误

c - 图邻接 vector - 文件