转自:https://blog.csdn.net/Ontheroad_/article/details/72739380
图的存储结构
1.邻接矩阵:两个数组,一个数组保存“顶点集”,一个数组保存“边集”。
无向图中:
有向图中:
2.邻接表:数组与链表相结合的存储方法。
对于带权值的网图,可以在边表结点定义中再增加一个weight的数据域,存储权值信息即可。
扫描二维码关注公众号,回复:
1961066 查看本文章
图的遍历
1.深度优先遍历(DFS):类似于树的先序遍历(递归实现)。从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径想通的顶点都被访问到。
伪代码实现:
def depth_tree(tree_node):
if tree_node is not None:
print(tree_node._data)
if tree_node._left is not None:
return depth_tree(tree_node._left)
if tree_node._right is not None:
return depth_tree(tree_node._right)
2.广度优先遍历(BFS):类似于树的层次遍历(队列实现)。
python代码实现:
def level_queue(root):
if root is None:
return
my_queue = []
node = root
my_queue.append(node)
while my_queue:
node = my_queue.pop(0)
print(node.elem)
if node.lchild is not None:
my_queue.append(node.lchild)
if node.rchild is not None:
my_queue.append(node.rchild)
最小生成树
构造连通网的最小代价生成树。
1.普里姆:先将一个起点加入最小生成树,之后不断寻找与最小生成树相连的权值最小的边能通向的点,并将其加入最小生成树,直至所有顶点都在最小生成树中。
2.克鲁斯卡尔:在剩下的所有未选取的边中,找最小边,如果和已选取的边构成回路,则放弃,选取次小边。
最短路径
1.迪杰斯特拉算法:把图中的顶点集合V分成两组,第一组为已求出最短路径的顶点集合S(初始时S中只有源节点,以后每求得一条最短路径,就将它对应的顶点加入到集合S中,直到全部顶点都加入到S中);第二组是未确定最短路径的顶点集合U。
2.弗洛伊德算法:
(1)从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
(2)对于每一对顶点u和v,看看是否存在一个顶点w使得从u到w再到v比已知的路径更短。如果是,则更新它。