邻接矩阵 Adjacency Matrix
组成:顶点数组(一维,存储顶点信息)+边数组(二维)
无向图的边数组是一个对称矩阵
邻接表 Adjacency List
邻接表(链表是出边) vs 逆邻接表(链表是入边)
十字****链表 Orthogonal List(针对有向图)
顶点表 data | firstin | firstout
边表
tailvex | headvex | headlink | taillink(headlink/taillink指向一个边结点整体) |
---|---|---|---|
该边的弧尾 | 该边的弧头 | 终点相同的下一条边 | 起点相同的下一条边 |
邻接多重表(针对无向图)
边集数组
def DFSTraverse():visited = [全部未访问]for 每一个顶点: if 未访问过这个顶点: DFS(从这个顶点开始) #连通图只会有一次def DFS():更新visited对该顶点操作for/while 每个与该顶点邻接的顶点: #矩阵可用for,链表可用whileif 未访问过这个顶点: DFS(这个邻接顶点)
逻辑:树的层序遍历;用队列实现
伪代码
def BFSTraverse():queue = 一个队列for 每一个顶点:if 未访问过这个顶点: #连通图只会有一次enqueue(当前顶点) # 若为连通图,只针对第一个元素while 队列非空: # 这个循环不断在队列中拿元素出来处理一个顶点 = dequeue()对顶点操作for/while 每个与该顶点邻接的顶点: #矩阵可用for,链表可用whileif 未访问过这个顶点: enqueue(这个邻接顶点)
目标:以最小的权值和构造一个图的连通网
def miniSpanTree_prim(图):lowcost = [第i个元素存放当前生成树和第i顶点之间已知的最小距离的列表]# 为0表示该顶点已在生成树里,为无限大表示该顶点与生成树还没有边相连adjvex = [第i个元素存放使其有上述所说的最小距离的边的邻接顶点]# 这个邻接顶点是已经在生成树里的#每轮将一个新的顶点纳入生成树for i = 1:n-1(n-1次循环,因为初始已经有一个顶点算在树里了):k = index(min(lowcost)) #找到与当前生成树距离最小的顶点,k是其序号将该路径加入最小生成树,并标注已加入 #(输出这条路径OR存放到某个地方)for j = 1:n:修正lowcost和adjvex# 因为这个被纳入生成树的顶点k又“开发了一小片新大陆”
def miniSpanTree_kruskal():for i = 1:n: (循环每一条边)n = find_parent(边[i].begin)m = find_parent(边[i].end)if n != m: # n==m意味着这条边连起来会形成环路将该边加入最小生成树def find_parent()return parent
逻辑
伪代码
def shortesetPath_Dijsktra():adjvex = []shortpathtable = []#每轮算出v0到某一个顶点的最短路径for i = 1:n-1 (n-1次循环):k = index(min(shortpathtable))(此时shortpathtable在k处的值就已经是最短路径)for j = 1:n:修正shortpathtable和adjvex
选顶点
修正
时间复杂度:O(n^2) (算出一个顶点和其余所有顶点间的最短距离)
def shortesetPath_Floyd():for k:for a:for b:if 路径[a→k]+路径[k→b] < 路径[a→b]:修正a→b的最短路径
本文发布于:2024-01-29 08:01:56,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170648651913850.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |