网站什么开发,APP网站开发私人订制,东莞网络推广网络推广,新冠咳嗽怎么办一、加权图的定义
加权图是边带有权重的图结构#xff0c;权重可表示距离、代价、时间、容量等实际意义#xff0c;分为加权无向图和加权有向图两类#xff1a;
加权无向图#xff1a;每条无向边 (u, v) 关联一个权重 w#xff0c;且 (u, v) 与 (v, u) 权重相同#xff1…一、加权图的定义加权图是边带有权重的图结构权重可表示距离、代价、时间、容量等实际意义分为加权无向图和加权有向图两类加权无向图每条无向边(u, v)关联一个权重w且(u, v)与(v, u)权重相同加权有向图每条有向边u, v关联一个权重wu, 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二、加权图的核心概念最短路径两顶点间权重之和最小的路径是加权图最核心的问题之一常见场景如地图导航的最短距离、网络传输的最小延迟。最小生成树仅适用于加权无向连通图指连接所有顶点且总权重最小的边集合且无环常用于构建低成本的通信、交通网络。最长路径两顶点间权重之和最大的路径在**加权有向无环图DAG**中可高效求解关键路径问题但含环的加权图中最长路径问题为NP难问题。负权边与负权环负权边权重为负数的边负权环路径权重之和为负数的环若两顶点间路径包含负权环则不存在最短路径可绕环无限减小路径总权重。三、加权图的存储方式1. 邻接矩阵用n×n二维数组adj存储adj[i][j]表示顶点i到j的边的权重若存在边则adj[i][j] 对应权重若不存在边则adj[i][j] ∞无穷大通常用一个极大值表示加权无向图的邻接矩阵对称加权有向图的邻接矩阵非对称。优缺点优点查询两顶点间边的权重时间复杂度为O(1)实现简单缺点空间复杂度为O(n²)稀疏图空间利用率低且无法高效存储多重边。2. 邻接表为每个顶点维护一个列表列表元素为**邻接顶点边权重**的二元组存储该顶点直接相连的顶点及对应边的权重加权无向图中添加边(u, v, w)时需在u的邻接表中添加(v, w)同时在v的邻接表中添加(u, w)加权有向图中添加边u, v, w时仅需在u的邻接表中添加(v, w)。优缺点优点空间复杂度为O(|V||E|)适合稀疏图遍历顶点邻接边效率高缺点查询两顶点间边的权重需遍历对应顶点的邻接表时间复杂度为O(deg(v))。四、加权图的核心算法1. 最短路径算法1Dijkstra算法适用场景加权图无负权边的单源最短路径即从一个起点到所有其他顶点的最短路径。核心思想贪心策略每次选择距离起点最近且未访问的顶点更新其邻接顶点的距离。实现方式可通过优先队列小顶堆优化时间复杂度为O(|E|log|V|)。2Bellman-Ford算法适用场景含负权边无负权环的单源最短路径且可检测图中是否存在负权环。核心思想松弛操作对所有边进行|V|-1次松弛若第|V|次仍能松弛则存在负权环。时间复杂度O(|V|×|E|)效率低于Dijkstra算法但兼容性更强。3Floyd-Warshall算法适用场景求解多源最短路径即任意两顶点间的最短路径支持含负权边无负权环的图。核心思想动态规划通过中间顶点k逐步优化顶点i到j的最短路径。时间复杂度O(n³)适合顶点数较少的图。2. 最小生成树算法1Prim算法适用场景加权无向连通图的最小生成树适合稠密图。核心思想从任意顶点出发每次选择与当前生成树顶点集合距离最近的顶点及对应边加入生成树直到包含所有顶点。优化方式优先队列优化时间复杂度为O(|E|log|V|)。2Kruskal算法适用场景加权无向连通图的最小生成树适合稀疏图。核心思想按边的权重从小到大排序依次选择边若边的两个顶点不在同一连通分量则加入生成树用并查集维护连通性直到生成树包含|V|-1条边。时间复杂度O(|E|log|E|)主要耗时在边排序。3. 关键路径算法适用场景加权有向无环图DAG的最长路径求解用于项目进度规划。核心步骤对DAG进行拓扑排序按拓扑序计算每个顶点的最早开始时间从起点到该顶点的最长路径逆拓扑序计算每个顶点的最晚开始时间从该顶点到终点的最长路径的逆推值最早开始时间等于最晚开始时间的顶点构成关键路径。五、加权图的实现示例1. 邻接表实现含Dijkstra算法importheapqclassWeightedGraph:def__init__(self,num_vertices,is_directedFalse):self.num_verticesnum_vertices self.is_directedis_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到各顶点的最短距离# 初始化距离数组无穷大表示不可达INFfloat(inf)dist[INF]*self.num_vertices dist[start]0# 起点到自身距离为0# 优先队列(当前距离, 顶点)小顶堆pq[(0,start)]visited[False]*self.num_vertices# 标记是否已确定最短距离whilepq:current_dist,uheapq.heappop(pq)ifvisited[u]:continuevisited[u]True# 遍历u的邻接顶点更新距离forv,weightinself.adj_list[u]:ifnotvisited[v]anddist[v]current_distweight:dist[v]current_distweight heapq.heappush(pq,(dist[v],v))returndist使用示例# 初始化无向加权图5个顶点graphWeightedGraph(5,is_directedFalse)# 添加边(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_distgraph.dijkstra(0)print(起点0到各顶点的最短距离:,shortest_dist)# 输出起点0到各顶点的最短距离: [0, 2, 3, 9, 6]六、加权图的典型应用路径规划地图导航的最短/最快路径如高德、百度地图的路径算法网络优化通信网络的最小成本布线最小生成树、网络节点间的最小延迟传输物流调度物流配送的最低运输成本路径规划、多仓库间的物资调配项目管理通过关键路径算法确定项目的最短完成时间和关键任务电路设计电路板布线的最短导线长度规划、信号传输的最小损耗路径。