Steam游戏自动破解器:三步实现离线游戏自由的终极指南
2026/5/4 14:16:30
加权图是边带有权重的图结构,权重可表示距离、代价、时间、容量等实际意义,分为加权无向图和加权有向图两类:
(u, v)关联一个权重w,且(u, v)与(v, u)权重相同;<u, v>关联一个权重w,<u, v>与<v, u>的权重可不同。加权图的形式化表示为G=(V, E, W),其中:
V为顶点集合;E为边集合;W为权重映射,W(e)表示边e对应的权重值。资料:https://pan.quark.cn/s/43d906ddfa1b、https://pan.quark.cn/s/90ad8fba8347、https://pan.quark.cn/s/d9d72152d3cf
用n×n二维数组adj存储,adj[i][j]表示顶点i到j的边的权重:
adj[i][j] = 对应权重;adj[i][j] = ∞(无穷大,通常用一个极大值表示);优缺点:
O(1),实现简单;O(n²),稀疏图空间利用率低,且无法高效存储多重边。为每个顶点维护一个列表,列表元素为**(邻接顶点,边权重)**的二元组,存储该顶点直接相连的顶点及对应边的权重:
(u, v, w)时,需在u的邻接表中添加(v, w),同时在v的邻接表中添加(u, w);<u, v, w>时,仅需在u的邻接表中添加(v, w)。优缺点:
O(|V|+|E|),适合稀疏图,遍历顶点邻接边效率高;O(deg(v))。O(|E|log|V|)。|V|-1次松弛,若第|V|次仍能松弛,则存在负权环。O(|V|×|E|),效率低于Dijkstra算法,但兼容性更强。k逐步优化顶点i到j的最短路径。O(n³),适合顶点数较少的图。O(|E|log|V|)。|V|-1条边。O(|E|log|E|)(主要耗时在边排序)。importheapqclassWeightedGraph:def__init__(self,num_vertices,is_directed=False):self.num_vertices=num_vertices self.is_directed=is_directed# 标记是否为有向图self.adj_list=[[]for_inrange(num_vertices)]# 邻接表元素为(邻接顶点, 权重)defadd_edge(self,u,v,weight):"""添加加权边,u、v为顶点编号,weight为边权重"""self.adj_list[u].append((v,weight))ifnotself.is_directed:# 无向图需添加反向边self.adj_list[v].append((u,weight))defdijkstra(self,start):"""Dijkstra算法求单源最短路径,返回从start到各顶点的最短距离"""# 初始化距离数组,无穷大表示不可达INF=float('inf')dist=[INF]*self.num_vertices dist[start]=0# 起点到自身距离为0# 优先队列:(当前距离, 顶点),小顶堆pq=[(0,start)]visited=[False]*self.num_vertices# 标记是否已确定最短距离whilepq:current_dist,u=heapq.heappop(pq)ifvisited[u]:continuevisited[u]=True# 遍历u的邻接顶点,更新距离forv,weightinself.adj_list[u]:ifnotvisited[v]anddist[v]>current_dist+weight:dist[v]=current_dist+weight heapq.heappush(pq,(dist[v],v))returndist# 初始化无向加权图(5个顶点)graph=WeightedGraph(5,is_directed=False)# 添加边:(u, v, weight)graph.add_edge(0,1,2)graph.add_edge(0,2,4)graph.add_edge(1,2,1)graph.add_edge(1,3,7)graph.add_edge(2,4,3)graph.add_edge(3,4,1)# 求起点0到各顶点的最短距离shortest_dist=graph.dijkstra(0)print("起点0到各顶点的最短距离:",shortest_dist)# 输出:起点0到各顶点的最短距离: [0, 2, 3, 9, 6]