下面用网友提供的数据,结合 Pandas + DFS 深度优先算法,自动读取Excel、构建有向图,批量算出全部可行路径。
日常做线路梳理、流程拓扑、节点链路分析,人工梳理极易漏路径、看错分支。
excel数据如下:
一、完整可运行代码
import pandas as pd
from collections import defaultdict, Counter
excel_file = "routes.xlsx"
# 读取Excel A列线路关系
df_read = pd.read_excel(excel_file, header=None, usecols=[0])
edges_raw = df_read[0].dropna().tolist()
# 解析节点边
edges = []
for line in edges_raw:
if'-'in str(line):
u, v = str(line).strip().split('-')
edges.append((u, v))
print("\n读取到的边:", edges)
# 构建有向图 + 统计入度、出度
graph = defaultdict(list)
in_degree = Counter()
out_degree = Counter()
for u, v in edges:
graph[u].append(v)
out_degree[u] += 1
in_degree[v] += 1
all_nodes = set(graph.keys()) | set(in_degree.keys())
start_nodes = [node for node in all_nodes if in_degree[node] == 0]
end_nodes = [node for node in all_nodes if out_degree[node] == 0]
print("=" * 60)
# DFS递归查找所有无环简单路径
deffind_paths(graph, start, end, path=None):
if path isNone:
path = [start]
if start == end:
return [path[:]]
paths = []
for neighbor in graph.get(start, []):
if neighbor in path:
continue
new_paths = find_paths(graph, neighbor, end, path + [neighbor])
paths.extend(new_paths)
return paths
# 遍历输出全部起止路径
for start in start_nodes:
for end in end_nodes:
all_paths = find_paths(graph, start, end)
if all_paths:
print(f"【{start} → {end}】共 {len(all_paths)} 条路径:")
for p in all_paths:
print(f" {'-'.join(p)}")
else:
print(f"【{start} → {end}】无路径")
二、本次实测原始线路数据
节点连线关系:
红庙-华隆、华隆-合肥、合肥-繁华、横溪-繁华、 合肥-横溪、红庙-昆山、昆山-芜湖、芜湖-繁华
三、程序实测输出结果
读取到的边: [('红庙', '华隆'), ('华隆', '合肥'), ('合肥', '繁华'), ('横溪', '繁华'), ('合肥', '横溪'), ('红庙', '昆山'), ('昆山', '芜湖'), ('芜湖', '繁华')]
============================================================
【红庙 → 繁华】共 3 条路径:
红庙-华隆-合肥-繁华
红庙-华隆-合肥-横溪-繁华
红庙-昆山-芜湖-繁华
四、核心优势
五、使用方法
六、源码获取或交流
需要本章或其他文章的源码和数据的同学,关注+三连,在对应文章下评论“6666“,加下面微信,发你!也可以拉你进群交流学习,加群备注:IT小本本学习
为了能随时获取最新动态,大家可以动动小手将公众号添加到“星标⭐”哦,点赞 + 关注,用时不迷路!!!!
关注公众号:IT小本本 👇