图
2016-03-23 12:48
1131 查看
一、图的定义和术语
1、完全图:当有n个顶点,e条边时,e=n*(n-1)/2时为完全图
2、有向完全图、稀疏图、稠密图
3、度:与顶点相连的边的数目。也有入度、出度
4、连通图:任意两个顶点都相通。
5、连通图生成树:连通图的极小连通子图生成的树。任意增加一边都会出现回路
6、强连通:在有向图中任意两个顶点相通
二、图的存储
1、邻接矩阵
一般采用二维数组进行存储
2、邻接表
对每个顶点都建立一个单链表。每个表中的节点由与该顶点相关联的节点组成。节点结构有三个域:邻接点、权值、下一条边的指针
三、图的遍历
一般增加一个标志数组用于记录该节点是否被访问过
1、DFS
当访问到某个顶点时,递归访问所有未访问的相邻节点。实际就是沿着图的某一分支进行搜索,直至末端,再回朔,沿另一分支进行搜索
2、BFS
类似于层次遍历,访问某个节点V时,依次访问所有与V相邻的节点,完了再从这些几点出发,再访问。
使用时用队列存储访问的节点。
四、最小代价生成树
1、定义
A 最小代价生成树的边数等于顶点个数-1,且是连通的
B 最小代价生成树的边的权值之和最小
2、prim算法(适用于稠密)
首先定义一个集合U,里面存放最小代价生成树的节点。初始化里面只放V0。接着从剩余的所有边中,选择U那一坨和剩下那坨连接的权值最小的边,把那个点加入U,继续循环,直至全部都在U里
3、Kruskal算法(适用于稀疏)
首先所有的点都是一个个独立的树。从可用边中选择一个当前权值最小的边,若那个边连接了两个不同的树,那么就用这个边,那两个子树也就合为一个树了。继续循环。
对于边的权的顺序处理,可以首先对边权进行排序,然后判断是否在一个树中。
对于判断是否在一个树中的处理,可以用数组做一个特殊的标记标记不同的树。首先每个树的标记不同。T[i]表示i节点所属的树,若两个T[I]==T[J],则两个属于同一个子树
五、有向无环图的应用(DAG)
1、判断一个图是否为无环
可以用拓扑排序,可以用DFS。当访问到一个已经访问过的节点时,就发生了回环
2、拓扑排序
应用的场景就是课A是课B的先行课,这样排序,看课是怎么上。
排序方法:在图中任意选择一个没有前驱的顶点输出,再删除该节点和他的所有边。再重复操作。
因此排序不唯一
3、关键路径(AOE)
应用场景就是一个工程施工,有多个子单位,多个子单位可以并发进行。看最短什么时候能完成施工,减少那个工程的时间就可以减少整体的时间。
实际就是从起点到终点的最长路径。
计算方法:按拓扑排序,算出每个顶点最早发生的时间,存与A[]。按逆拓扑排序,计算每个顶点最迟 发生的时间,放于B[].若A[i]=B[i],则那个点为关键活动,位于关键路径
六、最短路径
应用场景就是从点A到点B,若存在多条路径,求最短花费的路径
1、起点给定——Dijstra算法
思想就是首先初始化一个集合U,存放最短路径。开始里面为源点V0。然后遍历邻点。若存在,则判断是他们两点之间的直线权值最小,还是经过U里的点中转之后权值更小,选最小的,然后进行存储。
2、所有顶点之间的最短路径——Floyd算法
不常用,就不说了
1、完全图:当有n个顶点,e条边时,e=n*(n-1)/2时为完全图
2、有向完全图、稀疏图、稠密图
3、度:与顶点相连的边的数目。也有入度、出度
4、连通图:任意两个顶点都相通。
5、连通图生成树:连通图的极小连通子图生成的树。任意增加一边都会出现回路
6、强连通:在有向图中任意两个顶点相通
二、图的存储
1、邻接矩阵
一般采用二维数组进行存储
2、邻接表
对每个顶点都建立一个单链表。每个表中的节点由与该顶点相关联的节点组成。节点结构有三个域:邻接点、权值、下一条边的指针
三、图的遍历
一般增加一个标志数组用于记录该节点是否被访问过
1、DFS
当访问到某个顶点时,递归访问所有未访问的相邻节点。实际就是沿着图的某一分支进行搜索,直至末端,再回朔,沿另一分支进行搜索
2、BFS
类似于层次遍历,访问某个节点V时,依次访问所有与V相邻的节点,完了再从这些几点出发,再访问。
使用时用队列存储访问的节点。
四、最小代价生成树
1、定义
A 最小代价生成树的边数等于顶点个数-1,且是连通的
B 最小代价生成树的边的权值之和最小
2、prim算法(适用于稠密)
首先定义一个集合U,里面存放最小代价生成树的节点。初始化里面只放V0。接着从剩余的所有边中,选择U那一坨和剩下那坨连接的权值最小的边,把那个点加入U,继续循环,直至全部都在U里
3、Kruskal算法(适用于稀疏)
首先所有的点都是一个个独立的树。从可用边中选择一个当前权值最小的边,若那个边连接了两个不同的树,那么就用这个边,那两个子树也就合为一个树了。继续循环。
对于边的权的顺序处理,可以首先对边权进行排序,然后判断是否在一个树中。
对于判断是否在一个树中的处理,可以用数组做一个特殊的标记标记不同的树。首先每个树的标记不同。T[i]表示i节点所属的树,若两个T[I]==T[J],则两个属于同一个子树
五、有向无环图的应用(DAG)
1、判断一个图是否为无环
可以用拓扑排序,可以用DFS。当访问到一个已经访问过的节点时,就发生了回环
2、拓扑排序
应用的场景就是课A是课B的先行课,这样排序,看课是怎么上。
排序方法:在图中任意选择一个没有前驱的顶点输出,再删除该节点和他的所有边。再重复操作。
因此排序不唯一
3、关键路径(AOE)
应用场景就是一个工程施工,有多个子单位,多个子单位可以并发进行。看最短什么时候能完成施工,减少那个工程的时间就可以减少整体的时间。
实际就是从起点到终点的最长路径。
计算方法:按拓扑排序,算出每个顶点最早发生的时间,存与A[]。按逆拓扑排序,计算每个顶点最迟 发生的时间,放于B[].若A[i]=B[i],则那个点为关键活动,位于关键路径
六、最短路径
应用场景就是从点A到点B,若存在多条路径,求最短花费的路径
1、起点给定——Dijstra算法
思想就是首先初始化一个集合U,存放最短路径。开始里面为源点V0。然后遍历邻点。若存在,则判断是他们两点之间的直线权值最小,还是经过U里的点中转之后权值更小,选最小的,然后进行存储。
2、所有顶点之间的最短路径——Floyd算法
不常用,就不说了