//2019.05.22
一、图概述
1、图是由顶点集合以及顶点之间的关系集合组成的一种数据结构:G=(V,E)
2、分类:有向图(Directed graph)、无向图(Undirected graph)
(带权图(weighted graph)\属性图)
3、图数据处理的挑战
(1)结点和边可变大小
(2)结点无序(CNN\RNN)
(3)不同结点的局部连接不同
(4)结点之间相互依赖
(在这里区分节点和结点:节点被认为是一个实体,有处理能力,比如网络中的一台计算机;结点只是一个交叉结点,一般认为数据结构中的点都是结点)
二、基本图算法
1、基本遍历算法
(1)遍历的概念:从图的某一个顶点开始,按照某种算法不重复的访问图的所有顶点
(2)遍历算法
- 广度优先算法(BFS):引入队列解决
- 深度优先算法(DFS):引入链表
2、路径搜索算法
(1)最短路径问题:在带权图中,求两个顶点间所有可达路径中,边的权值之和最小的那一条路径。
(2)最短路径问题的经典算法:
- Dijkstra
- Floyd
3、图匹配算法
(1)基本概念
- 二分图
- 匹配:图论中,一个匹配是一个边的集合,其中任意两条边都没有公共顶点。
- 匹配边、匹配点
- 最大匹配:一个图的所有匹配中元素最多的匹配称之为最大匹配
- 完美匹配:一个图的最大匹配所对应的匹配点所构成的集合等于图的点集V,则称该匹配为完美匹配
- 增广路:从一个未匹配点v1出发,依次经过非匹配边、匹配边、非匹配边...最后一直到达另一个非匹配点v2,所组成的路称之为增广路(特性:可以将这个曾广路的匹配边和非匹配边互换,得到的最新的路径的匹配边数n比原来增加了1)
(2)算法:匈牙利算法
a)从图中选取未匹配点,并寻找增广路l;
b)对增广路上的未匹配边和匹配边进行互换,并将原增广路两端的未匹配点改为匹配点;
c)重复1,2,知道找不到增广路为止
4、图算法的应用
(1)最小生成树(引入贪心算法)
- Prim算法(加边法)
- Kruskal算法(加点法)
(2)拓扑排序
*对于一个DGA(有向无环图,不存在环的有向图),找到一个有顶点组成的序列,要求该序列应包含G的所有顶点组成的序列,要求该序列应包含G的所有顶点,且每个顶点只出现一次,且在后面的顶点一定没有通向前面所有顶点的路径。
*算法过程:a)从DGA图G中选取一个入度为0