美文网首页
图论模板总结

图论模板总结

作者: madao756 | 来源:发表于2020-07-09 16:35 被阅读0次

前言:图论那几个算法真的比较容易忘记,今天就来复习一下吧

0X00 模板总结

Dijkstra

算法本身就是用来求最短路径的

不能求带有负权边的情况,原因是:已经访问过的点可能被之后的负权更新导致 dist 变小。

849. Dijkstra求最短路 I O(n^2)

def dij(s, e):
    dist[s] = 0
    for i in range(1,n+1):
        t = -1
        for j in range(1, n+1):
            if not st[j] and (t == -1 or dist[t] > dist[j]):
                t = j
        if t == -1: break
        st[t] = True
        for j in range(1, n+1):
            dist[j] = min(dist[j], g[t][j] + dist[t])
    return dist[e]

850. Dijkstra求最短路 II O((V+E)logV)

from heapq import heappush, heappop
def dij(s, e):
    dist = [float("inf")] * (1+n)
    st = [False] * (1+n)
    dist[s] = 0
    minHeap = [(0, s)]
    
    while minHeap:
        d, v = heappop(minHeap)
        if st[v]: continue
        if v not in graph: continue
        st[v] = True
        for v1 in graph[v]:
            if dist[v1] > d + graph[v][v1]:
                dist[v1] = d + graph[v][v1]
                heappush(minHeap, (d + graph[v][v1], v1))
    return -1 if dist[e] == float("inf") else dist[e]

SPFA

851. spfa求最短路

求最短路,可以有负权边,时间复杂度为 O(VE)

还有其他的用途放在其他博客专门总结。

from collections import deque
def spfa(s, e):
    dist = [float("inf")] * (1+n)
    dist[s] = 0
    st = [False] * (1+n)
    st[s] = True
    q = deque([s])
    
    while q:
        v = q.popleft()
        st[v] = False
        for v1, d in g[v]:
            if dist[v1] > dist[v] + d:
                dist[v1] = dist[v] + d
                if not st[v1]:
                    st[v1] = True
                    q.append(v1)
    
    return dist[e]

bellman-ford

853. 有边数限制的最短路 这个算法就这一个作用:有边数限制的时候求最短路 时间复杂度是:O()

def bellFord(s, e, limit):
    dist[s] = 0
    
    for _ in range(limit):
        for i in range(1, n+1): backup[i] = dist[i]
        
        for i in range(m):
            a, b, c = edges[i]
            if dist[b] > backup[a] + c:
                dist[b] = backup[a] + c
        
    
    return dist[e]
            

Floyd

这个算法有很多其他用途,我会在其他博客中总结

854. Floyd求最短路 O(n^3)

def floyd():
    for k in range(1, n+1):
        for i in range(1, n+1):
            for j in range(1, n+1):
                g[i][j] = min(g[i][j], g[i][k] + g[k][j])

相关文章

  • 图论模板总结

    前言:图论那几个算法真的比较容易忘记,今天就来复习一下吧 0X00 模板总结 Dijkstra 算法本身就是用来求...

  • 图论相关算法模板

    许多书上的算法可能是为了易懂,显得比较冗长,这里尽可能给出简洁的实现: Bellman-Ford最短路算法 注意,...

  • 算法导论——图论总结

    图论总结 G=(V,E),V代表图中节点的合集,E代表图中边或是关系的合集。 稠密图:图中E的条数接近V*V也就是...

  • lemon 代码分析之文本解析

     lemon主要用于处理图论相关的算法,最短路径,最大流最小割。lemon代码库中大量使用模板,c++语言的bla...

  • <<数学之美>> part5

    摘要: [图论] [网络爬虫] [图的遍历] 图论 说到图论,必须要提的就是KonigsBerg七桥问题,简单说就...

  • 3000+模板如何做成的,一张复合饼图告诉你,不要着急下载哦

    年终总结、季度报告、月末总结大家都在忙着制作Excel图表,到处寻找模板,Excel模板都在这里,看看这些图表模板...

  • 《宇宙猜想》目录

    廿八学会 - 《宇宙图论》只是想将一切看得更清晰些(微信公众号:宇宙猜想) 《宇宙图论》目录 大目录 一、宇宙图论...

  • 算法与数据结构(十) 总结

    课程总结 过程: 线性问题: 树形问题: 图论问题: 更多算法问题 算法设计相关: 贪心:从最小到最大,或从最大到...

  • 蓝色简洁大气工作总结汇报PPT模板

    办公资源提供精美ppt模板,教育培训PPT模板,商务PPT模板,该模板是蓝色简洁大气工作总结汇报PPT模板,图片文...

  • 《数学之美》笔记 图论与网络爬虫

    离散数学包括数理逻辑,集合论,图论,近世代数。 图论 哥尼斯堡七桥问题(图论的起源):只有每个点的度都是偶数的情况...

网友评论

      本文标题:图论模板总结

      本文链接:https://www.haomeiwen.com/subject/eqescktx.html