Python 希勒霍尔泽';求欧拉循环的s算法

Python 希勒霍尔泽';求欧拉循环的s算法,python,chinese-postman,Python,Chinese Postman,我是图论的初学者。自5天以来,我一直在尝试使用Python将Hierholzer的算法实现到代码中。到目前为止,我在图论方面的经验也是5天。我的代码如下: def cycle(D1): import random key = list(D1.keys()) ran_k = random.choice(key) tmp_stk = [] tmp_stk += [ran_k] r_stack = [] if len(D1[ran_k]) >

我是图论的初学者。自5天以来,我一直在尝试使用Python将Hierholzer的算法实现到代码中。到目前为止,我在图论方面的经验也是5天。我的代码如下:

def cycle(D1):
    import random
    key = list(D1.keys())
    ran_k = random.choice(key)
    tmp_stk = []
    tmp_stk += [ran_k]
    r_stack = []
    if len(D1[ran_k]) > 1:
        tmp_stk += [D1[ran_k][0]]
        del D1[ran_k][0]
    else:
        tmp_stk += D1[ran_k]
        del D1[ran_k]
   flag = True
   while flag:
       try:
           if len(D1[tmp_stk[-1]]) > 1:
              tmp_stk += [D1[tmp_stk[-1]][0]]
              del D1[tmp_stk[-2]][0]
           else:
              tmp_stk += D1[tmp_stk[-1]]
              del D1[tmp_stk[-2]]
       except (KeyError):
            flag = False
            return D1,tmp_stk

def stack(tmp_stk,D1):
    r_stack = []
    if len(D1):
        for i in tmp_stk[::-1]:
            if i in D1.keys():
                 r_stack += tmp_stk[tmp_stk.index(i)+1:][::-1]
                 tmp_stk = tmp_stk[:tmp_stk.index(i)+1]
        return tmp_stk,r_stack
    else:
        r_stack += [tmp_stk[::-1]]
        return tmp_stk,r_stack

def cycle2(D1,tmp_stk):
    flag = True
    while flag:
        try:
           if len(D1[tmp_stk[-1]]) > 1:
              tmp_stk += [D1[tmp_stk[-1]][0]]
              del D1[tmp_stk[-2]][0]
           else:
              tmp_stk += D1[tmp_stk[-1]]
              del D1[tmp_stk[-2]]
        except (KeyError):
             flag = False
      return D1,tmp_stk

D2 = {0:[3],1:[0],2:[1,6],3:[2],4:[2],5:[4],6:[5,8]
     , 7:[9],8:[7],9:[6]} 
D2图是连通的,每个节点都有偶数度。当ran_k选择6作为起始节点,且欧拉电路为[6,5,4,2,1,0,3,2,6,8,7,9,6]时,我的代码(循环函数)工作正常。任何起始节点都有欧拉回路,因为D2图是强连通的,所有节点都有偶数度


当run_k选择0作为起始节点时,my cycle函数返回如下结果:剩余图:{2:[6],4:[2],5:[4],6:[5,8],7:[9],8:[7],9:[6]},临时堆栈返回为:[0,3,2,1,0]。这也没关系,因为我知道我必须在循环函数的这些输出上运行cycle2和stack函数。我可以在我的论文中解决这个问题,但我不知道如何使用while循环检查D2的长度为零或tmp_stk的长度为0来使用这些函数。我很高兴看到你的建议

在末尾添加此函数:


在末尾添加此函数:

def main(D):
d,ts = cycle(D)
if len(d):
    #flag = True
    r_s = []
    while len(d):
          #r_s = []
          ts,rs1,d = stack(ts,d)
          r_s += rs1
          d,ts = cycle2(d,ts)
    circle =  r_s+ts[::-1]
    return circle[::-1]
else:
    return ts