|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# Time : 2023/10/30 15:49
|
|
|
|
# Author : lirunsheng
|
|
|
|
# User : l'r's
|
|
|
|
# Software: PyCharm
|
|
|
|
# File : X3.py
|
|
|
|
|
|
|
|
from collections import Counter
|
|
|
|
···
|
|
|
|
class Solve ():
|
|
|
|
def node_dfs(self): # 遍历 深度优先算法
|
|
|
|
self.start = time.time() # 记录开始时间
|
|
|
|
self.way_sum = 0
|
|
|
|
self.ans.clear() # 初始化答案列表
|
|
|
|
E.edge_del_all(1) # 两点间仅保留距离最短路径
|
|
|
|
for edge in d.Edges: # 清空标记
|
|
|
|
edge[4] = False
|
|
|
|
i = 0 # 起始点
|
|
|
|
flag = [0] * len(d.Nodes) # 初始化已经过点
|
|
|
|
cur = i # 初始化起始点
|
|
|
|
flag[cur] = 1 # 将起始点标记为已经过
|
|
|
|
l = len(d.Nodes)
|
|
|
|
distances = [[math.inf for _ in range(l)]
|
|
|
|
for _ in range(l)]
|
|
|
|
result = d.node_coordinate(l)
|
|
|
|
for j in d.Edges: # 每一步选择当前最短的链接加到路径中去
|
|
|
|
if j[0] >= len(result):
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
if j[6] < 99 and j[7] < 99:
|
|
|
|
distances[result[j[0]][0]][
|
|
|
|
result[j[0]][1]] = j[6]
|
|
|
|
distances[result[j[0]][1]][
|
|
|
|
result[j[0]][0]] = j[6]
|
|
|
|
cost, ways = self.dfs(distances)
|
|
|
|
print(self.way_sum)
|
|
|
|
self.ans = ways.copy()
|
|
|
|
if len(ways) != l + 1:
|
|
|
|
tk.messagebox.askokcancel(title='结果',
|
|
|
|
message='该图不存在dfs路径')
|
|
|
|
# print(ways)
|
|
|
|
for way in range(len(ways) - 1): # 标记一条路径
|
|
|
|
d.Edges[G.way_node_edge(ways[way],
|
|
|
|
ways[way + 1])][4] = True
|
|
|
|
self.end = time.time() # 记录结束时间
|
|
|
|
self.ans.clear()
|
|
|
|
return -1
|
|
|
|
for way in range(len(ways) - 1): # 标记一条路径
|
|
|
|
d.Edges[G.way_node_edge(ways[way],
|
|
|
|
ways[way + 1])][4] = True
|
|
|
|
tk.messagebox.askokcancel(title='结果',
|
|
|
|
message='dfs算法路径')
|
|
|
|
self.end = time.time() # 记录结束时间
|
|
|
|
def greedy(self, distances):
|
|
|
|
num_cities = len(distances)
|
|
|
|
visited = [False] * num_cities
|
|
|
|
path = [0] # 起始城市为0
|
|
|
|
visited[0] = True
|
|
|
|
for _ in range(num_cities - 1):
|
|
|
|
curr_city = path[-1]
|
|
|
|
min_distance = float('inf')
|
|
|
|
next_city = None
|
|
|
|
|
|
|
|
for city in range(num_cities):
|
|
|
|
if not visited[city] and distances[curr_city][city] \
|
|
|
|
< min_distance and distances[curr_city][
|
|
|
|
city] != 0:
|
|
|
|
min_distance = distances[curr_city][city]
|
|
|
|
next_city = city
|
|
|
|
self.way_sum += 1 # 遍历路径的数目加一
|
|
|
|
|
|
|
|
if next_city is not None:
|
|
|
|
path.append(next_city)
|
|
|
|
visited[next_city] = True
|
|
|
|
if distances[path[-1]][0] != np.inf:
|
|
|
|
path.append(0) # 回到起始城市形成闭合路径
|
|
|
|
# print(path)
|
|
|
|
return path
|
|
|
|
if __name__ == '__main__':
|
|
|
|
···编程[11.2]与编程[11.5]主函数
|
|
|
|
s. node_greedy () # 开始遍历搜索合法路径
|