数据结构期末 图

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

基本概念

 A directed graph is called strongly connected if there is a directed path from any vertex to any other vertex. If we suppress the direction of the edges and the resulting undirected graph is connected, we call the directed graph weakly connected.

图存储 邻接矩阵与邻接表

 

 

 1)给定两个顶点 看他们是否相连 在邻接矩阵中只需要看第i行第j列的元素即可

而在邻接表中 要找到i的顶点 遍历链表各项看是否有j

2)看某个顶点的所有邻居 有向图中 入度为第i列元素之和

出度为第i行元素之和

3)所有顶点的邻居 遍历整个矩阵

 

图的遍历(DFS,BFS)(必考)

https://www.cs.usfca.edu/~galles/visualization/BFS.html

https://www.cs.usfca.edu/~galles/visualization/DFS.html

for(all v in G)<-对每个连通分量做一个循环

if(!visited[v])traverse()

 

拓扑排序(BFS方法) 有向无环图

首先找到没有入度的点 将这些点加入到队列。

然后不停地从队列中弹出点。

对每一个弹出的点,处理他们的后继,将入度减一。

当入度为0时,即可加入到队列中。

重复上述过程直到所有的点都从队列中弹出

       (1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
  (2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
  (3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.
先写好每个点的前驱集合 将每个前驱为空的入队 并将列表集合中相应的元素划去 如此循环

 

最小生成树 概念与Prim算法

prim算法维护数组 S V-S 每次挑一个点出来 最小距离做一次更新 扩展所连的点 松弛操作

先随便挑一个点 接下来每次挑的点是保证与已挑出点相连的权重最小的点

https://www.cs.usfca.edu/~galles/visualization/Prim.html

 

时间复杂度和空间复杂度

https://blog.csdn.net/Charles_ke/article/details/82497543

 

邻接表存储 图的DFS BFS Topsort均为时间复杂度O(V+E) 空间复杂度 O(V)

 

最短路径问题

单源

通常指给出一个起始点 s,求解 s到其他所有点的最短路径

多源

图中任意两点的最短路径

 

 

迪杰斯特拉算法

算法过程

从开始点起 每次加入通过已加入点从开始点可达的路径长度最短的点

https://www.cs.usfca.edu/~galles/visualization/Dijkstra.html

 

 

如何求得具体最短路径?

用一个辅助数组保存当前节点是从哪个点扩展来的

path[i] 表示 当前最短路径中,vi是通过哪一个点连接到起始点的,和BFS迷宫问题类似

posted @ 2020-01-02 21:52  柠檬味呀  阅读(172)  评论(0编辑  收藏  举报