【上篇】Python实现最短路问题常见求解算法——Label Correcting Algorithm(deque)

【路径规划】(1) Dijkstra 算法求解最短路,附python完整代码 Dijkstra 算法是典型的单源最短路径计算算法,用于解决源点到其它所有点之间的最短路径计算的问题。它采用了贪心的思想搜索全局,求取最优解。算法优点:鉴于 Dijkstra 算法的全局遍历性,其计算结果准确性非常高,Dijkstra 算法可以避开局部最优陷阱,100%的求解出最优路径。 阅读详情

基于python语言,实现deque label correcting 算法对最短路问题(Shortest Path Problem)进行求解。

1. 适用场景

  • 无负环网络
  • 起点与终点间至少存在一条可行路径
  • 可求解单一起点到多点的最短路径

2. 算法说明

应用标号法求解最短路问题时有两种选择,一是采用 label setting 策略,即 label setting algorithm,如经典的 Dijkstra’s algorithm ,或采用label correcting策略,即 label correcting algorithm,如经典的 FIFO label correcting algorithm、Deque label correcting algorithm。二者在最短路问题上都表现出较好的效率,但与 label setting algorithm算法相比,label correcting algorithm 算法更为灵活,易于扩展,且可以检测出含有负环的网络。本文采用python语言实现Deque label correcting algorithm 对不含负环网络的最短路问题进行求解。对于含有负环网络的最短路问题将在后续文章分享。

3. 测试网络

这里以Tempe ASU网络为测试数据集,网络如下图所示,可通过osm2gmns工具包获取。
在这里插入图片描述

4. 代码实现

(1)定义网络数据结构

# define network data struct
class Network():
    def __init__(self):
        self.node_neighbors={}
        self.node_x_coord={}
        self.node_y_coord={}
        self.node_id_list=[]
        self.number_of_nodes=0
        self.link_cost={}
        self.link_list=[]

        self.source_node_id=0
        self.sink_node_id=1

(2)读取网络文件

# read network csv files
def read_network_file(node_file,link_file,network):
    # read node csv file
    with open(node_file) as node_f:
        node_reader=csv.reader(node_f)
        next(node_reader)
        for row in node_reader:
            network.node_id_list.append(int(row[0]))
            network.node_x_coord[int(row[0])] = float(row[1])
            network.node_y_coord[int(row[0])] = float(row[2])
            network.node_neighbors[int(row[0])] = []
    # read link csv file
    with open(link_file) as f:
        link_reader = csv.reader(f)
        next(link_reader)
        for row in link_reader:
            from_node_id = int(row[1])
            to_node_id = int(row[2])
            cost = float(row[3])
            network.node_neighbors[from_node_id].append(to_node_id)
            network.link_list.append([from_node_id, to_node_id])
            network.link_cost[from_node_id, to_node_id] = cost
    network.number_of_nodes = len(network.node_id_list)
    return network

(3)可视化最短路径

def show_shortest_path(net,path_node_id_list):
    for from_node_id,to_node_id in net.link_list:
        x_coords=[net.node_x_coord[from_node_id],net.node_x_coord[to_node_id]]
        y_coords=[net.node_y_coord[from_node_id],net.node_y_coord[to_node_id]]
        plt.plot(x_coords,y_coords,color='black',linewidth=0.5)
    path_x_coord=[]
    path_y_coord=[]
    for node_id in path_node_id_list:
        path_x_coord.append(net.node_x_coord[node_id])
        path_y_coord.append(net.node_y_coord[node_id])
    plt.plot(path_x_coord,path_y_coord,color='b')
    plt.xlabel('x_coord')
    plt.ylabel('y_coord')
    plt.show()

(4)保存最短路径信息

# save the shortest path information to csv file
def save_to_file(network,path_node_id_list,path_cost,node_predecessor=None,node_label_cost=None):
    outfile = open('shortest_path.csv', 'w', newline='', errors='ignore')
    write = csv.writer(outfile)

    write.writerow(['source_node_id', 'sink_node_id', 'total cost', 'path node id list'])
    path = '-'.join([str(i) for i in path_node_id_list])
    line = [network.source_node_id, network.sink_node_id,path_cost,path]
    write.writerow(line)
    # whether save the shortest path information from  the source node to other nodes
    if node_predecessor and node_label_cost:
        try:
            for node_id in network.node_id_list:
                if node_id!=network.source_node_id and node_id!=network.sink_node_id:
                    path_node_id_list = [node_id]
                    pre_node_id = node_predecessor[node_id]
                    path_cost = 0
                    if node_label_cost[node_id]<float('inf'):
                        while pre_node_id != network.source_node_id:
                            path_node_id_list.insert(0, pre_node_id)
                            path_cost += network.link_cost[path_node_id_list[0], path_node_id_list[1]]
                            pre_node_id = node_predecessor[pre_node_id]
                        path_node_id_list.insert(0, network.source_node_id)
                        path_cost += network.link_cost[path_node_id_list[0], path_node_id_list[1]]
                        path = '-'.join([str(i) for i in path_node_id_list])
                        line = [network.source_node_id, node_id, path_cost, path]
                        write.writerow(line)
                    else:
                        line = [network.source_node_id, node_id, 'inf', 'nan']
                        write.writerow(line)
        except Exception as e:
            pass
    outfile.close()

(5)采用label correcting算法的deque实现寻找最短路径

# find the shortest path from source node to sink node using deque label correcting algorithm
def find_shortest_path(network):
    node_predecessor = {}
    node_predecessor[network.source_node_id]=None
    node_label_cost = { node_id:float('inf') for node_id in network.node_id_list}
    node_label_cost[network.source_node_id] = 0
    SEList = deque()
    SEList_all = []
    SEList.append(network.source_node_id)
    SEList_all.append(network.source_node_id)
    while len(SEList)>0:
        current_node_id=SEList[0]
        SEList.popleft()
        current_node_label_cost = node_label_cost[current_node_id]
        for to_node_id in network.node_neighbors[current_node_id]:
            new_label=current_node_label_cost+network.link_cost[current_node_id,to_node_id]
            if new_label<node_label_cost[to_node_id]:
                node_label_cost[to_node_id]=new_label
                node_predecessor[to_node_id]=current_node_id
                if to_node_id in SEList_all:
                    SEList.insert(0,to_node_id)
                else:
                    SEList.append(to_node_id)
                SEList_all.append(to_node_id)

    path_node_id_list = [network.sink_node_id]
    pre_node_id = node_predecessor[network.sink_node_id]
    path_cost = 0
    if node_label_cost[network.sink_node_id]<float('inf'):
        while pre_node_id != network.source_node_id:
            path_node_id_list.insert(0, pre_node_id)
            path_cost += network.link_cost[path_node_id_list[0], path_node_id_list[1]]
            pre_node_id = node_predecessor[pre_node_id]
        path_node_id_list.insert(0, network.source_node_id)
        path_cost += network.link_cost[path_node_id_list[0], path_node_id_list[1]]
        path = '-'.join([str(i) for i in path_node_id_list])
        print("the trave cost from node id=%s to node id=%s is: %s" % (network.source_node_id, network.sink_node_id, path_cost))
        print("the shortest path from node id=%s to node id=%s is: %s" % (network.source_node_id, network.sink_node_id, path))

        show_shortest_path(network, path_node_id_list)
        save_to_file(network, path_node_id_list, path_cost,node_predecessor,node_label_cost)
    else:
        print("there is no feasible path from node id=%s to node id=%s"%(network.source_node_id,network.sink_node_id))

(6)主程序

if __name__=='__main__':
    # init network data struct
    network=Network()
    # setting source node  id and sink node id
    network.source_node_id=4177
    network.sink_node_id=3881
    # read network files
    read_network_file('./node.csv','./link.csv',network)
    # check whether the source node id and sink node id is in the network
    if network.source_node_id not in network.node_id_list:
        print(" %s not found"%network.source_node_id)
        sys.exit(0)
    if network.sink_node_id not in network.node_id_list:
        print(" %s not found"%network.sink_node_id)
        sys.exit(0)
    # find the shortest path
    find_shortest_path(network)

5. 求解结果

在这里插入图片描述

6. 代码及数据文件

相关代码及数据文件可从github主页获取:

https://github.com/PariseC/Shortest_Path_Algorithm/tree/master/label_correcting_algorithm

参考

  1. R.K. Ahuja, T.L. Magnanti and J.B. Orlin, Network Flows: Theory, Algorithms, and Applications. Prentice-Hall, 1993. A comprehensive recent survey of the topic.
Python:最短路 如下图所示,GG 是一个无向图,其中蓝色边的长度是 11、橘色边的长度是 22、绿色边的长度是 33。 阅读详情

相关推荐

【信息科学与工程学】【数据中心】 第二十三篇【智算中心】DDC网络-满足大规模训练、推理、存储区网络(Roce2组网)-01

设计维度目标值设计原则实现手段评估指标性能目标​端到端延迟<10ms低延迟优先RDMA优化,拓扑扁平化延迟分布,p99延迟可用性目标​99.99%可用性冗余设计多路径,设备冗余MTBF,MTTR吞吐目标​核心交换>10Tbps无阻塞交换大带宽核心,Clos架构对分带宽扩展性目标​线性扩展至1000节点模块化设计标准Pod架构扩展成本函数安全目标​零信任架构纵深防御微分段,加密传输安全事件数能效目标​PUE<1.2绿色计算高效设备,智能调度能效比(W/IOPS) 2. 物理拓扑设计 2.1 数据中心物理

weixin_49199313的博客 564

网络流规划中的Label Correcting Algorithm详解与C++实现

Label Correcting Algorithm 主要用于求解有向图中的单源最短路径问题,与 Dijkstra 算法类似,但它能够更好地处理图中存在负权重边的情况。该算法使用一个队列来存储待处理的顶点,并且允许顶点在队列中多次出现。Label Correcting Algorithm 提供了一个强大的工具,用于解决单源最短路径问题,尤其是在图中存在负权重边的情况下。虽然它在理论上的性能可能不如其他算法,如 Dijkstra 或 Bellman-Ford 算法,但它在处理特定类型的图时非常有效。

qq_41551761的博客 1382

【信息科学与工程学】计算机科学与自动化——第三百零五篇 计算机系统中的各类运算操作01

编号类型领域运算操作运算类型算法算法的详细设计及数学分析参数列表及参数的数值设计应用场景 (100+条)集合运算​1集合运算关系代数并集 (Union)集合运算归并排序去重合并两个集合,去除重复元素。时间复杂度 O(n+m),n,m为两集合大小。输入:集合A, B。输出:A∪B。数据集成、多表结果合并、去重后的全量数据提取。2集合运算关系代数交集 (Intersection)集合运算哈希交集找出同时属于两个集合的元素。平均时间复杂度 O(min(n,m)),最坏 O(n*m)。输入:集合A, B。输出:A∩

weixin_49199313的博客 1389

Python实现动态规划Labeling算法求解SPPRC问题

Python实现动态规划Labeling算法求解SPPRC问题SPPRC问题Labeling算法Python编程实现首先在python中对该图进行定义:创建Label类调用labeling算法计算 本文中的课件来自清华大学深圳国际研究生院,物流与交通学部戚铭尧教授《物流地理信息系统》课程。 SPPRC问题   带资源约束的最短路径问题(shortest path problem with resource constraints)是一个众所周知的NP-Hard问题。 除了作为网络问题直接应用外,SPPR

旸的博客 4817

【信息科学与工程学】计算机科学与自动化——第一百五十五篇 缓存系统设计01 基础知识

CPU:拥有 L1/L2/L3 多级缓存,用于暂存即将执行的指令和频繁访问的数据。GPU:包含显存、纹理缓存、常量缓存、指令缓存等,加速图形渲染和通用计算。RAID 卡 / 存储控制器:自带缓存(通常带电池保护),用于合并写操作、加速读写。打印机:内置内存缓存,用于暂存待打印的页面数据,避免反复从电脑传输。光驱 / 蓝光播放器:内部缓存用于平滑读取光盘数据,防止因寻道延迟导致卡顿。操作系统:页缓存(Page Cache):缓存文件系统数据,减少磁盘 I/O。目录缓存(dentry cache):加速路径查找

weixin_49199313的博客 290

用Django实现社交网络分析:图建模、中心性与社区发现实战

社交网络分析(SNA)是挖掘用户关系价值的关键技术,但海量关系数据如何存储与计算一直是工程难点。关系型数据库与图数据库各有优劣,在Django这类Web框架中,利用邻接表建模配合合理索引,可在百万级节点下高效支撑中心性计算、社区发现等图算法。从度中心性的聚合SQL优化,到标签传播算法(LPA)的实现,再到最短路径BFS与关系图可视化,每一步都需要权衡查询性能与扩展性。本文基于Django完整展示了从数据建模、算法落地到性能调优的工程实践,帮助开发者快速构建可运行的社交网络分析系统,避开N+1查询、全量计算等

weixin_33428613的博客 242

Python实现最短路问题常见求解算法1——Label Correcting Algorithm(deque)

原文链接 1. 适用场景 无负环网络 起点与终点间至少存在一条可行路径 可求解单一起点到多点的最短路径 2. 算法说明 应用标号法求解最短路问题时有两种选择,一是采用 label setting 策略,即 label setting algorithm,如经典的 Dijkstra’s algorithm ,或采用label correcting策略,即 label correcting algorithm,如经典的 FIFO label correcting algorithm、Deque label

qq_36744449的博客 1483

系统-等保三级-CentOS Linux 7合规基线检查 shell脚本

系统-等保三级-CentOS Linux 7合规基线检查 shell脚本

swindy博客 2409

【下篇】Python实现最短路问题常见求解算法——Label Correcting Algorithm(deque)

基于python语言,实现deque label correcting 算法对最短路问题(Shortest Path Problem)进行求解,可以识别网络中是否含有负环。

Better.C的博客 1069

PIN限幅二极管在接收机中的应用

本文介绍了接收机保护限幅器的工作原理及应用,重点阐述了PIN二极管在雷达收发机中的关键作用。文章指出,限幅器能有效保护接收机灵敏元件免受大功率信号损害,主要通过反射而非耗散功率来实现保护功能。文章详细分析了PIN二极管的层结构特性及其阻抗变化机制,解释了多级限幅器的设计原理(包括清理级和粗限幅器的配合使用),并介绍了通过添加检波二极管降低阈值水平的方法。最后指出,实际应用中限幅器通常采用3级或更少的设计。

weixin_49761275的博客 2376

苹果开发者账号注册指南:解决Apple Developer app证件验证失败问题

本文详细解析了苹果开发者账号注册中证件验证失败的常见原因与解决方案。核心在于确保Apple ID、设备与iCloud信息一致,并提供了从官方支持联系到材料准备的全流程操作指南,帮助开发者高效解决“未能验证证件”问题,顺利完成注册。

weixin_29232507的博客 2258

Python实现最短路问题常见求解算法2——Label Correcting Algorithm(deque)

原文链接 1. 适用场景 可识别网络中存在的负环 起点与终点间至少存在一条可行路径 可求解单一起点到多点的最短路径 2. 负环识别方法 在介绍网络负环识别方法之前,先定义几个符号: nnn :网络节点数量 CCC :网络弧费用绝对值的最大值 根据《netwrok flow》文献介绍,针对label correcting algorithms有以下识别方法: 如果某一节点的距离标签小于 −nC−nC−nC 则说明存在负环(在最坏情况下源点到此点经过所有节点,所有的弧费用值的绝对值都是C,则最小的cos

qq_36744449的博客 527

Python爬虫实战:逆向工程与异步处理攻克Pinterest无限滚动瀑布流

我们将从零开始,逐步分析其数据接口,构建一个功能完整的爬虫,并深入探讨反爬虫策略的应对、性能优化以及数据存储等高级主题。: 在实际爬取中,你需要先访问一次Pinterest主页,获取初始的Cookie和CSRF Token,然后再发起API请求。: Python爬虫,Pinterest,无限滚动,瀑布流,异步IO,httpx,逆向工程,API接口,动态内容,反爬虫。你会很快发现一些关键的请求模式。:页面初始加载有限内容,随着用户滚动,新的图片块通过AJAX动态加载,实现“永无止境”的浏览。

2201_76125261的博客 552

最短路标号法python_最短路问题与标号算法(label correcting algorithm)研究(1) - 开篇介绍...

作者:崔赞扬、李崇楠指导老师:周学松教授校对:邓发珩、周航、向柯玮 序言本系列推文重在从算法基本原理、复杂度分析、优缺点、代码实现、算法扩展等方面科普Label Correcting Algorithm(最短路算法重要分支),同时给出了下一步学习内容建议。本文在周学松教授的指导下完成,特别感谢周学松教授的全程指导,感谢姚宇、牛志强、张宇丰在文章结构、内容安排、内容校对等方面提出的宝贵建议...

weixin_42517137的博客 1090

SwiftUI 5 教程之 SwiftData使用入门(教程含源码)

对我来说,记住日期很难。是的,您可以设置该日期的提醒,但该提醒无法产生紧迫感。让我们创建一个应用程序,我们可以在其中添加将来发生的事件。如果我们可以在主应用程序上看到所有即将发生的活动,那就太好了。也许将它们添加到小部件上以营造紧迫感。对于任何事件,我们需要跟踪哪些事情?我们将在下一篇文章中添加更多属性,其中我们将讨论迁移。现在,这就是我们所需要的。开始吧。

iCloudEnd的博客 987

手把手教你学Simulink--基于微电网的建模与仿真场景实例:独立运行模式下微电网的能量管理系统设计

本文详细介绍了使用Simulink对独立运行微电网能量管理系统进行建模与仿真的完整流程。主要包括:系统结构设计(分布式能源、储能系统、负荷等模块)、建模步骤(从创建项目到实现能量管理策略)、仿真设置与结果分析。通过建立基于规则的控制逻辑和优化调度算法,实现微电网的自主运行和能量优化管理。文章还提供了参数优化和多目标改进建议,为新能源和智能电网领域的研究与应用提供了实用指导。

MHD0815的博客 8587

Label Correcting Algorithm(Python实现)

代码: from collections import deque import numpy as np class edge: #定义边 def __init__(self,start,end,cost): self.Start=start self.End=end self.Cost=cost...

OI -> ACM -> AI 2176

408 | 408常用计算公式与方法 —— 计组篇 汇总

408常用计算公式与方法 —— 计算机组成原理篇 汇总

"You are worthy! You can do it!" 4658

Dijkstra与Bellman-Ford算法:最短路径核心原理与工程选型指南

最短路径算法是图论中的基础概念,用于在带权图中寻找两点间总权重最小的路径。其核心原理在于通过迭代松弛操作,不断更新顶点间的最短距离估计值,直至收敛到最优解。这类算法具有重要的技术价值,是实现网络高效路由、物流智能调度等复杂系统优化的关键。在应用场景上,Dijkstra算法凭借其贪心策略和堆优化,成为地图导航、OSPF路由协议等正权图场景下的高效选择;而Bellman-Ford算法则因其能处理负权边并检测负权环,在金融套利路径分析等场景中不可或缺。本文聚焦于这两个经典的单源最短路径算法,深入对比其核心思想、实

weixin_33871366的博客 352

STM32实战开发(65):STM32摄像头图像采集开发教程

我们将会详细介绍如何使用STM32进行摄像头控制、图像数据采集以及如何将采集到的图像数据传输到其他设备进行处理。通过这篇博客,您将能够掌握STM32与摄像头模块的图像采集技术,应用于各种图像处理场景。为了确保STM32能够正确接收图像数据,我们需要配置STM32的GPIO引脚,并通过外部中断捕获这些信号。为了实现更高效的图像采集,可以通过DMA进行数据传输,将图像数据直接从GPIO引脚存储到内存中。通过DMA传输,我们可以将采集到的图像数据直接存储在内存中的一个缓冲区,然后进行后续的图像处理。

2201_76125393的博客 2540

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

数学建模中管道铺设问题的Python求解:从最小生成树到混合整数规划

网络优化是运筹学和计算机科学中的核心问题,旨在通过图论模型寻找资源分配或连接方案的最优解。其基本原理是将实际问题抽象为节点和边构成的图,利用算法在满足约束条件下优化目标函数,如成本最小化或流量最大化。该技术在工程领域价值显著,能有效解决物流配送、通信网络设计等复杂决策问题。在基础设施规划特别是管道铺设场景中,网络优化需要融合图论、整数规划和流体力学,以平衡建设成本与水力性能。本文聚焦数学建模竞赛中的经典难题,探讨如何运用Python将最小生成树、混合整数非线性规划等算法,转化为应对地形、管径、流量多约束的实

weixin_33895516的博客 425

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

LaTeX+Python数学建模闭环路径:从公式推导到可验证代码

数学建模的核心能力不是堆砌工具或背诵模型,而是建立‘问题定义→逻辑推导→计算验证→文档固化’的完整闭环。LaTeX 不仅是排版工具,更是强制结构化思维、暴露隐藏假设的逻辑组织系统;Python 也不仅是实现载体,而是通过 assert 断言、KS 检验、AIC 准则等手段让模型与算法具备可审查性。本文聚焦无线解调算法基础、vscode latex安装、latex cref 等高频实践痛点,揭示工具链断裂的本质——缺乏写即思、算即验、验即固的动作咬合。适用于竞赛入门、跨专业建模及工程快速验证场景,强调每一步都

weixin_34220179的博客 393

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Python+AI构建智能旅游咨询平台的技术实践

自然语言处理(NLP)和推荐系统是AI技术的核心应用领域,通过语义理解将用户模糊需求转化为结构化查询,结合协同过滤算法实现个性化推荐。在旅游行业,这种技术组合能显著提升用户体验,典型应用包括智能问答、动态行程规划和实时价格预测。本文以Django+Flask混合架构为例,详解如何整合BERT意图识别、遗传算法路径优化等关键技术,解决旅游咨询场景中的冷启动、多模态数据处理等工程挑战。项目实践表明,采用Sentence-BERT的语义匹配方案使问答准确率提升32%,Prophet时间序列模型在节假日价格预测上比

weixin_30265103的博客 403

最短路算法 算法 python实现

Dijkstra 算法[python] Dijstra作为一种经典的单源最短路算法,得到了广泛应用。 算法思想如下: 说明: S为最短路顶点集合 U为尚未加入S的顶点集合 cijc_{ij}cij​表示点i和点j之间的距离 wijw_{ij}wij​表示点i和点j之间的权重 初始时S只包含源点v,v到自己的距离为0. 从U中选择顶点temp,使得v->temp的距离最短,然后把temp加入S。 以temp为中间点,调整v到U中所有顶点的最短路径,分为两种情况 (1)经过temp,则路径长度为cv,t

Mirrors的博客 1660

最短路之Dijkstra算法——以不同城市之间的距离为例(基于python)

有具体算法,也有第三方库直接调用,两个例子,明白如何求最短路(路权非负)。最后案例为设备更新问题

qq_60471758的博客 4121

admm算法_最短路问题与标号算法(label setting algorithm)研究(1) 开篇介绍

作者:崔赞扬、李崇楠指导老师:周学松教授校对:邓发珩、周航、向柯玮序言本系列推文重在从算法基本原理、复杂度分析、优缺点、代码实现、算法扩展等方面科普Label Correcting Algorithm(最短路算法重要分支),同时给出了下一步学习内容建议。本文在周学松教授的指导下完成,特别感谢周学松教授的全程指导,感谢姚宇、牛志强、张宇丰在文章结构、内容安排、内容校对等方面提出的宝贵建议。...

weixin_39891158的博客 1081
上一篇: Python实现最短路问题常见求解算法——A*算法
下一篇: 【下篇】Python实现最短路问题常见求解算法——Label Correcting Algorithm(deque)
Better.C
博客等级 码龄9年 1万+粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Better.C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值