以结果为导向的学习也许可以更加持久
线路:逻辑结构->存储结构->遍历->典型应用
如何理解算法?
-
先理解算法的基本思想
-
将算法用顶层伪代码表示
-
再分析算法执行过程
-
得出算法的存储结构
基本术语
-
网图(adjacent):带权的图
-
弧:有向边
-
依附(adhere):边依附于一对临接点(adjacent)
-
顶点的度:无向图中依附于该顶点的边的个数
-
入度:有向图中···
-
出度:同理···
-
-
完全图:任意两个顶点之间都有边
-
稠密图,稀疏图:易得
-
简单路径:路径中同一歌结点只出现一次
-
简单回路:同理,只不过头结点和尾结点是同一个结点
-
联通图:任意顶点之间均有路径
-
连通分量:非连通图的极大连通子图
-
注意极大和最大的区别
-
-
强连通图:在有向图中
-
强连通分量:同理
-
-
图的邻接矩阵存储及实现
-
如何利用邻接矩阵来遍历图?
-
DFT
-
BFT
-
图的邻接表存储及实现
-
链接存储与顺序存储相结合
-
链接存储:取一个顶点,将与它相连的所有顶点用链式结构链接,类似树的孩子表示法。边表
-
顺序存储:将所有的边表中指向第一个孩子的指针和它们的顶点组合成顶点表结点。顶点表
-
-
两种结点结构:
-
顶点表结点:顶点数据(vertex) + 第一个指针(first)
-
边表结点:临接点域(adjvex)存放该结点在顺序存储中的下标 + 下一个(next)
-
生成树:包含图中全部顶点的一个极小连通子图
-
最小生成树,体会极小和最小的区别
Prim算法
-
从一个点开始,从目前已知路径中选一条最短的
-
现在有两个点,再从已知路径中选择最短的路径,但是要满足生成树中的定义
-
······
有点鼠目寸光的感觉(bushi)
Kruskal算法
最短路径:第一个点是源点,最后一个点是终点
以下两个算法见了两三次了,只有一次看完了,根本看不懂,只能大致领会它的意思,不如自己设计一个算法,不知道是不是没有人想这个算法,觉得不如暴力求解来的轻松。下面两个算法丝毫没有体会到美感,一定是因为我没有理解它们。
Dijkstra算法
-
单源点到所有终点最短路径
Floyd算法
-
每一对源点最短路径
有向无环图及其应用
AOV网与拓扑排序
-
AOV网
-
工程图,有向图
-
顶点表示活动
-
弧表示活动之间的优先关系
-
没有回路
-
-
拓扑排序
-
检测图中有没有回路
-
对一个有向图构造拓扑排序的过程
-
拓扑排序:结点v到w有一条路径(有向),则v一定在w之前
-
-
-
步骤:
-
选择一个没有前驱的结点删除
-
删除所有以该结点为出发点(尾)的弧
-
···
-
AOE网与关键路径(最大路径长度)
ps:你没必要将每一个问题都找到最优解,你只要能够理解现有的,并且在实际问题中用上它,或者自己想出一种解决办法就可以了。