我是Graph理论的初学者。我一直在尝试使用Python将Hierholzer的算法实现到代码中5天。到目前为止,我对图论的经验也是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图强连接,所有节点都有均匀度。
当ran_k选择0作为起始节点时,我的循环函数返回如下:剩余图:{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的长度。我很高兴看到你的建议。
答案 0 :(得分: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