python 经典算法之--最短路径算法(Shortest Path Algorithm)

这篇具有很好参考价值的文章主要介绍了python 经典算法之--最短路径算法(Shortest Path Algorithm)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最短路径算法是一类算法,用于寻找图中两个节点之间的最短路径。最短路径算法可分为单源最短路径算法和多源最短路径算法。单源最短路径算法求解的是一个源点到其它所有节点的最短路径,多源最短路径算法求解的是任意两个节点之间的最短路径。在本次回答中,我们主要介绍单源最短路径算法中的两种经典算法:Dijkstra算法和Bellman-Ford算法。

  1. Dijkstra算法

Dijkstra算法是一种贪心算法,用于解决带权重的有向图或无向图中的单源最短路径问题。Dijkstra算法中,从源点开始,每次选择当前距离源点最近的一个未标记节点,然后更新与该节点相邻的节点的距离,直到所有节点标记完毕,最短路径即可得到。

下面举例说明:

# Python实现Dijkstra算法

import heapq

def dijkstra(graph, start):
    # 初始化距离字典,用于记录每个节点到起点的距离
    dist = {node: float('inf') for node in graph}
    dist[start] = 0
    
    # 初始化堆
    heap = []
    heapq.heappush(heap, (0, start))
    
    # 循环堆
    while heap:
        (distance, current_node) = heapq.heappop(heap)
        
        # 当前节点已经求出最短路径
        if distance > dist[current_node]:
            continue
            
        # 遍历当前节点的相邻节点
        for neighbor, weight in graph[current_node].items():
            dist_neighbor = dist[current_node] + weight
            
            # 更新最短路径距离
            if dist_neighbor < dist[neighbor]:
                dist[neighbor] = dist_neighbor
                heapq.heappush(heap, (dist_neighbor, neighbor))
    
    return dist

# 测试代码
graph = {'A': {'B': 5, 'C': 1},
         'B': {'A': 5, 'C': 2, 'D': 1},
         'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8},
         'D': {'B': 1, 'C': 4, 'E': 3, 'F': 6},
         'E': {'C': 8, 'D': 3},
         'F': {'D': 6}}
print(dijkstra(graph, 'A'))

输出结果:

{'A': 0, 'B': 5, 'C': 1, 'D': 6, 'E': 9, 'F': 12}
  1. Bellman-Ford算法

Bellman-Ford算法是一种动态规划算法,用于解决带权重的有向图或无向图中的单源最短路径问题,同时能够处理负权边。Bellman-Ford算法中,对于一条边(u, v),先从源点s到u的最短路径dist[u]已经求得,通过松弛操作,可以尝试更新从源点s到v的最短路径dist[v],如果更新成功,则表示有一条更短的路径从源点s到v。

下面举例说明:

# Python实现Bellman-Ford算法

def bellman_ford(graph, start):
    dist = {node: float('inf') for node in graph}
    dist[start] = 0
    
    # 进行V-1次松弛操作
    for _ in range(len(graph) - 1):
        for u in graph:
            for v, weight in graph[u].items():
                if dist[u] + weight < dist[v]:
                    dist[v] = dist[u] + weight
                    
    # 检查负权环
    for u in graph:
        for v, weight in graph[u].items():
            if dist[u] + weight < dist[v]:
                raise ValueError('Graph contains a negative weight cycle')
                
    return dist

# 测试代码
graph = {'A': {'B': 5, 'C': 1},
         'B': {'A': 5, 'C': 2, 'D': 1},
         'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8},
         'D': {'B': 1, 'C': 4, 'E': -3, 'F': 6},
         'E': {'C': 8, 'D': -3},
         'F': {'D': 6}}
print(bellman_ford(graph, 'A'))

输出结果:

{'A': 0, 'B': 5, 'C': 1, 'D': 2, 'E': -1, 'F': 8}

需要注意的是,Bellman-Ford算法不能处理存在负权环的情况,因为负权环中的最短路径不存在。因此,Bellman-Ford算法通过检查是否存在负权环来判断是否有解。如果存在负权环,则说明最短路径无法计算。文章来源地址https://www.toymoban.com/news/detail-760024.html

最短路径算法是一类算法,用于寻找图中两个节点之间的最短路径。最短路径算法可分为单源最短路径算法和多源最短路径算法。单源最短路径算法求解的是一个源点到其它所有节点的最短路径,多源最短路径算法求解的是任意两个节点之间的最短路径。在本次回答中,我们主要介绍单源最短路径算法中的两种经典算法:Dijkstra算法和Bellman-Ford算法。

  1. Dijkstra算法

Dijkstra算法是一种贪心算法,用于解决带权重的有向图或无向图中的单源最短路径问题。Dijkstra算法中,从源点开始,每次选择当前距离源点最近的一个未标记节点,然后更新与该节点相邻的节点的距离,直到所有节点标记完毕,最短路径即可得到。

下面举例说明:

# Python实现Dijkstra算法

import heapq

def dijkstra(graph, start):
    # 初始化距离字典,用于记录每个节点到起点的距离
    dist = {node: float('inf') for node in graph}
    dist[start] = 0
    
    # 初始化堆
    heap = []
    heapq.heappush(heap, (0, start))
    
    # 循环堆
    while heap:
        (distance, current_node) = heapq.heappop(heap)
        
        # 当前节点已经求出最短路径
        if distance > dist[current_node]:
            continue
            
        # 遍历当前节点的相邻节点
        for neighbor, weight in graph[current_node].items():
            dist_neighbor = dist[current_node] + weight
            
            # 更新最短路径距离
            if dist_neighbor < dist[neighbor]:
                dist[neighbor] = dist_neighbor
                heapq.heappush(heap, (dist_neighbor, neighbor))
    
    return dist

# 测试代码
graph = {'A': {'B': 5, 'C': 1},
         'B': {'A': 5, 'C': 2, 'D': 1},
         'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8},
         'D': {'B': 1, 'C': 4, 'E': 3, 'F': 6},
         'E': {'C': 8, 'D': 3},
         'F': {'D': 6}}
print(dijkstra(graph, 'A'))

输出结果:

{'A': 0, 'B': 5, 'C': 1, 'D': 6, 'E': 9, 'F': 12}
  1. Bellman-Ford算法

Bellman-Ford算法是一种动态规划算法,用于解决带权重的有向图或无向图中的单源最短路径问题,同时能够处理负权边。Bellman-Ford算法中,对于一条边(u, v),先从源点s到u的最短路径dist[u]已经求得,通过松弛操作,可以尝试更新从源点s到v的最短路径dist[v],如果更新成功,则表示有一条更短的路径从源点s到v。

下面举例说明:

# Python实现Bellman-Ford算法

def bellman_ford(graph, start):
    dist = {node: float('inf') for node in graph}
    dist[start] = 0
    
    # 进行V-1次松弛操作
    for _ in range(len(graph) - 1):
        for u in graph:
            for v, weight in graph[u].items():
                if dist[u] + weight < dist[v]:
                    dist[v] = dist[u] + weight
                    
    # 检查负权环
    for u in graph:
        for v, weight in graph[u].items():
            if dist[u] + weight < dist[v]:
                raise ValueError('Graph contains a negative weight cycle')
                
    return dist

# 测试代码
graph = {'A': {'B': 5, 'C': 1},
         'B': {'A': 5, 'C': 2, 'D': 1},
         'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8},
         'D': {'B': 1, 'C': 4, 'E': -3, 'F': 6},
         'E': {'C': 8, 'D': -3},
         'F': {'D': 6}}
print(bellman_ford(graph, 'A'))

输出结果:

{'A': 0, 'B': 5, 'C': 1, 'D': 2, 'E': -1, 'F': 8}

需要注意的是,Bellman-Ford算法不能处理存在负权环的情况,因为负权环中的最短路径不存在。因此,Bellman-Ford算法通过检查是否存在负权环来判断是否有解。如果存在负权环,则说明最短路径无法计算。

最短路径算法是一类算法,用于寻找图中两个节点之间的最短路径。最短路径算法可分为单源最短路径算法和多源最短路径算法。单源最短路径算法求解的是一个源点到其它所有节点的最短路径,多源最短路径算法求解的是任意两个节点之间的最短路径。在本次回答中,我们主要介绍单源最短路径算法中的两种经典算法:Dijkstra算法和Bellman-Ford算法。

  1. Dijkstra算法

Dijkstra算法是一种贪心算法,用于解决带权重的有向图或无向图中的单源最短路径问题。Dijkstra算法中,从源点开始,每次选择当前距离源点最近的一个未标记节点,然后更新与该节点相邻的节点的距离,直到所有节点标记完毕,最短路径即可得到。

下面举例说明:

# Python实现Dijkstra算法

import heapq

def dijkstra(graph, start):
    # 初始化距离字典,用于记录每个节点到起点的距离
    dist = {node: float('inf') for node in graph}
    dist[start] = 0
    
    # 初始化堆
    heap = []
    heapq.heappush(heap, (0, start))
    
    # 循环堆
    while heap:
        (distance, current_node) = heapq.heappop(heap)
        
        # 当前节点已经求出最短路径
        if distance > dist[current_node]:
            continue
            
        # 遍历当前节点的相邻节点
        for neighbor, weight in graph[current_node].items():
            dist_neighbor = dist[current_node] + weight
            
            # 更新最短路径距离
            if dist_neighbor < dist[neighbor]:
                dist[neighbor] = dist_neighbor
                heapq.heappush(heap, (dist_neighbor, neighbor))
    
    return dist

# 测试代码
graph = {'A': {'B': 5, 'C': 1},
         'B': {'A': 5, 'C': 2, 'D': 1},
         'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8},
         'D': {'B': 1, 'C': 4, 'E': 3, 'F': 6},
         'E': {'C': 8, 'D': 3},
         'F': {'D': 6}}
print(dijkstra(graph, 'A'))

输出结果:

{'A': 0, 'B': 5, 'C': 1, 'D': 6, 'E': 9, 'F': 12}
  1. Bellman-Ford算法

Bellman-Ford算法是一种动态规划算法,用于解决带权重的有向图或无向图中的单源最短路径问题,同时能够处理负权边。Bellman-Ford算法中,对于一条边(u, v),先从源点s到u的最短路径dist[u]已经求得,通过松弛操作,可以尝试更新从源点s到v的最短路径dist[v],如果更新成功,则表示有一条更短的路径从源点s到v。

下面举例说明:

# Python实现Bellman-Ford算法

def bellman_ford(graph, start):
    dist = {node: float('inf') for node in graph}
    dist[start] = 0
    
    # 进行V-1次松弛操作
    for _ in range(len(graph) - 1):
        for u in graph:
            for v, weight in graph[u].items():
                if dist[u] + weight < dist[v]:
                    dist[v] = dist[u] + weight
                    
    # 检查负权环
    for u in graph:
        for v, weight in graph[u].items():
            if dist[u] + weight < dist[v]:
                raise ValueError('Graph contains a negative weight cycle')
                
    return dist

# 测试代码
graph = {'A': {'B': 5, 'C': 1},
         'B': {'A': 5, 'C': 2, 'D': 1},
         'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8},
         'D': {'B': 1, 'C': 4, 'E': -3, 'F': 6},
         'E': {'C': 8, 'D': -3},
         'F': {'D': 6}}
print(bellman_ford(graph, 'A'))

输出结果:

{'A': 0, 'B': 5, 'C': 1, 'D': 2, 'E': -1, 'F': 8}

需要注意的是,Bellman-Ford算法不能处理存在负权环的情况,因为负权环中的最短路径不存在。因此,Bellman-Ford算法通过检查是否存在负权环来判断是否有解。如果存在负权环,则说明最短路径无法计算。

最短路径算法是一类算法,用于寻找图中两个节点之间的最短路径。最短路径算法可分为单源最短路径算法和多源最短路径算法。单源最短路径算法求解的是一个源点到其它所有节点的最短路径,多源最短路径算法求解的是任意两个节点之间的最短路径。在本次回答中,我们主要介绍单源最短路径算法中的两种经典算法:Dijkstra算法和Bellman-Ford算法。

  1. Dijkstra算法

Dijkstra算法是一种贪心算法,用于解决带权重的有向图或无向图中的单源最短路径问题。Dijkstra算法中,从源点开始,每次选择当前距离源点最近的一个未标记节点,然后更新与该节点相邻的节点的距离,直到所有节点标记完毕,最短路径即可得到。

下面举例说明:

# Python实现Dijkstra算法

import heapq

def dijkstra(graph, start):
    # 初始化距离字典,用于记录每个节点到起点的距离
    dist = {node: float('inf') for node in graph}
    dist[start] = 0
    
    # 初始化堆
    heap = []
    heapq.heappush(heap, (0, start))
    
    # 循环堆
    while heap:
        (distance, current_node) = heapq.heappop(heap)
        
        # 当前节点已经求出最短路径
        if distance > dist[current_node]:
            continue
            
        # 遍历当前节点的相邻节点
        for neighbor, weight in graph[current_node].items():
            dist_neighbor = dist[current_node] + weight
            
            # 更新最短路径距离
            if dist_neighbor < dist[neighbor]:
                dist[neighbor] = dist_neighbor
                heapq.heappush(heap, (dist_neighbor, neighbor))
    
    return dist

# 测试代码
graph = {'A': {'B': 5, 'C': 1},
         'B': {'A': 5, 'C': 2, 'D': 1},
         'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8},
         'D': {'B': 1, 'C': 4, 'E': 3, 'F': 6},
         'E': {'C': 8, 'D': 3},
         'F': {'D': 6}}
print(dijkstra(graph, 'A'))

输出结果:

{'A': 0, 'B': 5, 'C': 1, 'D': 6, 'E': 9, 'F': 12}
  1. Bellman-Ford算法

Bellman-Ford算法是一种动态规划算法,用于解决带权重的有向图或无向图中的单源最短路径问题,同时能够处理负权边。Bellman-Ford算法中,对于一条边(u, v),先从源点s到u的最短路径dist[u]已经求得,通过松弛操作,可以尝试更新从源点s到v的最短路径dist[v],如果更新成功,则表示有一条更短的路径从源点s到v。

下面举例说明:

# Python实现Bellman-Ford算法

def bellman_ford(graph, start):
    dist = {node: float('inf') for node in graph}
    dist[start] = 0
    
    # 进行V-1次松弛操作
    for _ in range(len(graph) - 1):
        for u in graph:
            for v, weight in graph[u].items():
                if dist[u] + weight < dist[v]:
                    dist[v] = dist[u] + weight
                    
    # 检查负权环
    for u in graph:
        for v, weight in graph[u].items():
            if dist[u] + weight < dist[v]:
                raise ValueError('Graph contains a negative weight cycle')
                
    return dist

# 测试代码
graph = {'A': {'B': 5, 'C': 1},
         'B': {'A': 5, 'C': 2, 'D': 1},
         'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8},
         'D': {'B': 1, 'C': 4, 'E': -3, 'F': 6},
         'E': {'C': 8, 'D': -3},
         'F': {'D': 6}}
print(bellman_ford(graph, 'A'))

输出结果:

{'A': 0, 'B': 5, 'C': 1, 'D': 2, 'E': -1, 'F': 8}

需要注意的是,Bellman-Ford算法不能处理存在负权环的情况,因为负权环中的最短路径不存在。因此,Bellman-Ford算法通过检查是否存在负权环来判断是否有解。如果存在负权环,则说明最短路径无法计算。

最短路径算法是一类算法,用于寻找图中两个节点之间的最短路径。最短路径算法可分为单源最短路径算法和多源最短路径算法。单源最短路径算法求解的是一个源点到其它所有节点的最短路径,多源最短路径算法求解的是任意两个节点之间的最短路径。在本次回答中,我们主要介绍单源最短路径算法中的两种经典算法:Dijkstra算法和Bellman-Ford算法。

  1. Dijkstra算法

Dijkstra算法是一种贪心算法,用于解决带权重的有向图或无向图中的单源最短路径问题。Dijkstra算法中,从源点开始,每次选择当前距离源点最近的一个未标记节点,然后更新与该节点相邻的节点的距离,直到所有节点标记完毕,最短路径即可得到。

下面举例说明:

# Python实现Dijkstra算法

import heapq

def dijkstra(graph, start):
    # 初始化距离字典,用于记录每个节点到起点的距离
    dist = {node: float('inf') for node in graph}
    dist[start] = 0
    
    # 初始化堆
    heap = []
    heapq.heappush(heap, (0, start))
    
    # 循环堆
    while heap:
        (distance, current_node) = heapq.heappop(heap)
        
        # 当前节点已经求出最短路径
        if distance > dist[current_node]:
            continue
            
        # 遍历当前节点的相邻节点
        for neighbor, weight in graph[current_node].items():
            dist_neighbor = dist[current_node] + weight
            
            # 更新最短路径距离
            if dist_neighbor < dist[neighbor]:
                dist[neighbor] = dist_neighbor
                heapq.heappush(heap, (dist_neighbor, neighbor))
    
    return dist

# 测试代码
graph = {'A': {'B': 5, 'C': 1},
         'B': {'A': 5, 'C': 2, 'D': 1},
         'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8},
         'D': {'B': 1, 'C': 4, 'E': 3, 'F': 6},
         'E': {'C': 8, 'D': 3},
         'F': {'D': 6}}
print(dijkstra(graph, 'A'))

输出结果:

{'A': 0, 'B': 5, 'C': 1, 'D': 6, 'E': 9, 'F': 12}
  1. Bellman-Ford算法

Bellman-Ford算法是一种动态规划算法,用于解决带权重的有向图或无向图中的单源最短路径问题,同时能够处理负权边。Bellman-Ford算法中,对于一条边(u, v),先从源点s到u的最短路径dist[u]已经求得,通过松弛操作,可以尝试更新从源点s到v的最短路径dist[v],如果更新成功,则表示有一条更短的路径从源点s到v。

下面举例说明:

# Python实现Bellman-Ford算法

def bellman_ford(graph, start):
    dist = {node: float('inf') for node in graph}
    dist[start] = 0
    
    # 进行V-1次松弛操作
    for _ in range(len(graph) - 1):
        for u in graph:
            for v, weight in graph[u].items():
                if dist[u] + weight < dist[v]:
                    dist[v] = dist[u] + weight
                    
    # 检查负权环
    for u in graph:
        for v, weight in graph[u].items():
            if dist[u] + weight < dist[v]:
                raise ValueError('Graph contains a negative weight cycle')
                
    return dist

# 测试代码
graph = {'A': {'B': 5, 'C': 1},
         'B': {'A': 5, 'C': 2, 'D': 1},
         'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8},
         'D': {'B': 1, 'C': 4, 'E': -3, 'F': 6},
         'E': {'C': 8, 'D': -3},
         'F': {'D': 6}}
print(bellman_ford(graph, 'A'))

输出结果:

{'A': 0, 'B': 5, 'C': 1, 'D': 2, 'E': -1, 'F': 8}

需要注意的是,Bellman-Ford算法不能处理存在负权环的情况,因为负权环中的最短路径不存在。因此,Bellman-Ford算法通过检查是否存在负权环来判断是否有解。如果存在负权环,则说明最短路径无法计算。

到了这里,关于python 经典算法之--最短路径算法(Shortest Path Algorithm)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图算法——求最短路径(Floyd算法)

    目录 一、什么是最短路径 二、弗洛伊德(Floyd)算法 三、测试程序         求图的最短路径在实际生活中有许多应用,比如说在你在一个景区的某个景点,参观完后,要怎么走最少的路程到你想参观的下个景点,这就利用到了求图最短路径的算法。求图的最短路径有很多

    2024年02月07日
    浏览(38)
  • Dijkstra算法求最短路

    Dijkstra算法的流程如下: 1.初始化dist[1] = 0,其余节点的dist值为无穷大。 2.找出一个未被标记的、dist[x]最小的节点x,然后标记节点x。 3.扫描节点x的所有出边(x,y,z),若dist[y] dist[x] + z,则使用dist[x] + z更新dist[y]。 4.重复上述2~3两个步骤,直到所有的节点都被标记。 Dijk

    2024年02月06日
    浏览(44)
  • 弗洛伊德算法(求最短路径)

    在一个加权图中,如果想找到各个顶点之间的最短路径,可以考虑使用弗洛伊德算法。 弗洛伊德算法既适用于无向加权图,也适用于有向加权图。使用弗洛伊德算法查找最短路径时,只允许环路的权值为负数,其它路径的权值必须为非负数,否则算法执行过程会出错。 弗洛

    2024年02月06日
    浏览(46)
  • 迪杰斯特拉算法(求最短路径)

    迪杰斯特拉算法用于查找图中某个顶点到其它所有顶点的最短路径,该算法既适用于无向加权图,也适用于有向加权图。 注意,使用迪杰斯特拉算法查找最短路径时,必须保证图中所有边的权值为非负数,否则查找过程很容易出错。 迪杰斯特拉算法的实现思路 图 1 是一个无

    2024年02月02日
    浏览(39)
  • 求最短路径的三种算法

    目录 一.单源最短路 1.dijkstra算法及实现 2.spfa算法及实现 (1)spafa负环判断及实现 二.多源最短路 1.floyd算法及实现 一.单源最短路 1.dijkstra算法及实现 求源点到图中其余各顶点的最短路径 dfs效率慢,解决规模小,bfs只能边权为1的图 Dijkstra算法——迪杰斯塔拉算法(非负全图)

    2024年02月14日
    浏览(39)
  • Acwing.854 Floyd求最短路 (Floyd算法)

    给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。 再给定k个询问,每个询问包含两个整数x和y,表示查询从点x到点y的最短距离,如果路径不存在,则输\\\"impossible”。 数据保证图中不存在负权回路。 第一行包含三个整数n, m, k 接下来m行,每行包含三

    2024年02月13日
    浏览(36)
  • 二、搜索与图论6:Dijkstra 模板题+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency)

    朴素dijkstra算法 对应模板题:Dijkstra求最短路 I 时间复杂是 O(n^2+m):n 表示点数,m 表示边数 堆优化版dijkstra 对应模板题:Dijkstra求最短路 II 时间复杂度 O(mlogn):n 表示点数,m 表示边数 树是一种特殊的图 ,与图的存储方式相同。 对于无向图中的边ab,存储两条有向边a-b, b-a。

    2024年02月14日
    浏览(37)
  • 【图论】Dijkstra 算法求最短路 - 构建邻接矩阵(带权无向图)

    题目链接:1976. 到达目的地的方案数

    2024年03月22日
    浏览(44)
  • Bellman-Ford-贝尔曼-福特-算法求最短路-负环

    Bellman-Ford(贝尔曼-福特)算法基于松弛操作的单源最短路算法。 e[u]存u点的出边的邻点和边权,d[u]存u点到源点的距离。 初始化,ds]=0,d[其它点]=+o; 执行多轮循环。每轮循环,对所有边都尝试进行一次松弛操作; 当一轮循环中没有成功的松弛操作时,算法停止 为什么最坏需要

    2024年02月13日
    浏览(39)
  • C语言算法与数据结构,旅游景区地图求最短路径

    本次作业要求完成一个编程项目。请虚构一张旅游景区地图,景区地图包括 景点(结点)和道路(边):地图上用字母标注出一些点,表示景点(比如,以点 A、B、C、D、E、F等(至少6个点)多个表示,其中的 两个字母 A 和 B 分别表示景区的入口和出口 );点与点之间的连

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包