【问题标题】:Edge classification using DFS使用 DFS 进行边缘分类
【发布时间】:2018-02-22 16:53:46
【问题描述】:

我使用 networkx 创建了一个图形,我想在每条边上添加一个“类”属性,以了解是向前、向后、交叉还是树。 作为下一步,我尝试在 python 中实现以下伪代码,但是当我打印图形边缘时,每个边缘的输出都有空的“类”属性。

DFS (V, E)

1.     for each vertex u in V[G]
2.        do color[u] ← WHITE
3.                π[u] ← NIL
4.     time ← 0
5.     for each vertex u in V[G]
6.        do if color[u] ← WHITE
7.                then DFS-Visit(u)              ▷ build a new DFS-tree from u

DFS-Visit(u)         ▷ with edge classification. G must be a directed graph

1.        color[u] ← GRAY
2.        time ← time + 1
3.        d[u] ← time
4.        for each vertex v adjacent to u
5.            do if color[v] ← BLACK
6.                then if d[u] < d[v]
7.                            then Classify (u, v) as a forward edge
8.                            else Classify (u, v) as a cross edge
9.                        if color[v] ← GRAY
10.                            then Classify (u, v) as a back edge
11.                      if color[v] ← WHITE
12.                            then π[v] ← u
13.                                    Classify (u, v) as a tree edge
14.                                    DFS-Visit(v)
15.        color[u] ← BLACK
16.        time ← time + 1
17.        f[u] ← time

这是我的代码:

def dfs_visit(u):
    color[u] = 'gray'
    global time
    time = time + 1
    d[u] = time
    for v in G.neighbors(u):
        if color[v] == 'black':
            if d[u] < d[v]:
                G.edges[u,v]['class'] = 'forward'
            else:
                G.edges[u,v]['class'] ='cross'
            if color[v] == 'gray':
                G.edges[u, v]['class'] = 'back'
            if color[v] == 'white':
                p[v] = u
                G.edges[u, v]['class'] = 'tree'
                dfs_visit(v)
    color[u] = 'black'
    time = time + 1
    f[u] = time



for u in G.nodes():
    color[u] = 'white'
time = 0
for u in G.nodes():
    if color[u] == 'white':
        dfs_visit(u)

print(G.edges(data=True))

如果我打印所有图边,我会得到以下输出:

[(1, 2, {'class': ''}), (1, 6, {'class': ''}), (2, 3, {'class': ''}), (6, 3, {'class': ''}), (3, 4, {'class': ''}), (3, 1, {'class': 'cross'}), (3, 7, {'class': ''}), (4, 5, {'class': ''}), (4, 7, {'class': ''})]

每条边的类属性为空。我该如何解决?

【问题讨论】:

  • @LeeYan 如果答案解决了你的问题,你能考虑接受吗?

标签: python algorithm networkx graph-theory breadth-first-search


【解决方案1】:

可能是缩进问题,试试以下方法:

def dfs_visit(u):
    color[u] = 'gray'
    global time
    time = time + 1
    d[u] = time
    for v in G.neighbors(u):
        if color[v] == 'black':
            if d[u] < d[v]:
                G.edges[u,v]['class'] = 'forward'
            else:
                G.edges[u,v]['class'] ='cross'
        if color[v] == 'gray':
            G.edges[u, v]['class'] = 'back'
        if color[v] == 'white':
            p[v] = u
            G.edges[u, v]['class'] = 'tree'
            dfs_visit(v)
    color[u] = 'black'
    time = time + 1
    f[u] = time

【讨论】:

    猜你喜欢
    • 2016-07-06
    • 2011-11-13
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2018-11-20
    • 1970-01-01
    • 2012-10-17
    相关资源
    最近更新 更多