未定向和未加权树中最长的路径 - 在python中

时间:2016-09-29 14:27:07

标签: python algorithm

我正在解决一个问题,我需要计算树的直径。我知道如何计算使用2 bfs首先找到最远的节点然后使用我们从第一个节点找到的节点做第二个bfs。 / p>

但是我很难实现一个非常简单的步骤 - 从输入中创建一个邻接列表(在python的情况下为dict)我已经为此编写了一个代码,但它不整齐而且不是最好的有人可以告诉我该怎么做这很有效率

  

输入

     

输入文件的第一行包含一个整数N ---数字   树中的节点(0      

示例

     

8

     

1 2

     

1 3

     

2 4

     

2 5

     

3 7

     

4 6

     

7 8

我的代码是:

def makedic(m):
    d = {}
    for i in range(m):
        o, p = map(int, raw_input().split())
        if o not in d and p not in d:
             d[p] = []
             d[o] = [p]
        elif o not in d and p in d:
             d[o] = []
             d[p].append(o)
        elif p not in d and o in d:
            d[p] = []
            d[o].append(p)
        elif o in d:
            d[o].append(p)
           # d[p].append(o)
        elif p in d:
            d[p].append(o)
    return d

以下是我实施bfs的方法:

def bfs(g,s):
    parent={s:None}
    level={s:0}
    frontier=[s]
    ctr=1
    while frontier:
        next=[]
        for i in frontier:
            for j in g[i]:
                if j not in parent:
                    parent[j]=i
                    level[j]=ctr
                    next.append(j)
        frontier=next
        ctr+=1
     return level,parent

2 个答案:

答案 0 :(得分:-1)

在第一个 elif 条件下,您在makedic中使用 0 而不是 o 。还对无向图进行了修正。

def makedic(m):
    d = {}
    for i in range(m):
        o, p = map(int, raw_input().split())
        if o not in d and p not in d:
             d[p] = [o]
             d[o] = [p]
        elif o not in d and p in d:
             d[o] = [p]
             d[p].append(o)
        elif p not in d and o in d:
            d[p] = [o]
            d[o].append(p)
        elif o in d:
            d[o].append(p)
            d[p].append(o)
    return d

答案 1 :(得分:-1)

您的代码中有不必要的检查。对于每个 A - B 边缘,您只需将 B 放入 A 的邻接列表和 A B 的邻接列表中:

d = {}
for i in range(m):
    u,v = map(int, raw_input().split())
    if u in d:
        d[u].append(v)
    else:
        d[u] = [v]
    if v in d:
        d[v].append(u)
    else:
        d[v] = [u]   

根据问题,每个节点都有 1 N 之间的索引,因此您可以使用此事实并使用空列表预先填充dict。这样您就不必检查密钥是否在dict中。还要使代码更短一些:

N = input()
d = { i:[] for i in range(1, N+1) }
for i in range(N):
    u,v = map(int, raw_input().split())
    d[u].append(v)
    d[v].append(u)