解:
欧拉通路:遍历所有的边的一条路径
存在的充要条件:
2个点一个点出度大于入度(起始点),一个点入度大于出度(终止点)
或 所有点出度=入度(欧拉回路)
欧拉回路:遍历所有的边并回到初始点的一条回路
存在的充要条件:
所有点出度=入度(欧拉回路)
此题即遍历所有的边的一条路径,并不一定要回到JFC,所以是求欧拉通路问题,用dfs其实就是套圈法:
1、用dfs一延边找点,由于题目说要字典序,就按字典序来找,若找到不能继续往下找的点,记为p,此即为终止点
2、回溯到其上层节点,走别的路,由于p是唯一的终止点,所以再找一定最后可以回来(除p和JFC外其他都出度=入度)
3、不断重复1、2,直到所有边全部遍历
def findItinerary(self, tickets):
"""
:type tickets: List[List[str]]
:rtype: List[str]
"""
res = []
stack = []
stack.append('JFK')
while 1 :
if len(tickets) == 0:
break
EdgeIndex = -1
NowPoint = stack[-1]
MinPoint = 'ZZZ'
flag = 0
for i in range(0,len(tickets)):
if tickets[i][0] == NowPoint:
if len(res) > 0:
if tickets[i][1] == res[0]:
flag = 1
continue
if MinPoint > tickets[i][1]:
MinPoint = tickets[i][1]
EdgeIndex = i
if EdgeIndex == -1:
if flag == 1:
break
res.append(stack.pop())
continue
stack.append(MinPoint)
del tickets[EdgeIndex]
return stack + res[::-1]
注意:res记录的时候是逆序的,最后要reverse一下