一、图的定义及相关概念
1. 图的定义
图是由两个集合构成的结构,记为G = (V,E), E = {<v,w> | v,w ∈V且有P<v,w>}
其中,V是定点的又穷非空集合,E是图中描述定点关系的集合,此集合可以为空。
2. 无向图;有向图:
3. 完全图、有向完全图:
无向图中任意两个顶点之间都有边相连的图。n(n-1)/2条不同的边。
有向图中任意两个顶点之间都有两条反向的弧相连。n(n-1)条不同的弧。
4. 权,网:
与边或弧相关的信息叫做权。带权的图---网。
5. 度,入度,初度:
与顶点v相关的边的数目称为顶点v的度,记为TD(v)。
顶点为头的弧的数目叫做入度ID(v);
顶点为尾的弧的数目叫做出度O(v).
6. 路径,简单路径,回路,简单回路
路径:顶点v到顶点w的顶点序列。
路径中顶点不重复出现---简单路径。
第一个顶点与最后一个顶点相同的路径---回路。
除了第一个和最后一个顶点其他顶点不重复出现的回路---简单回路。
7. 连通图,强连通图:
如果顶点v到w有路径,则称v和w是连通的。如果图中任意两个顶点连通,则,图为连通图。
有向图满足上述性质---强连通图。
8. 子图,连通分量,强连通分量:
V'∈V,E'∈E,则G'为G的子图,无向图的极大连通子图称为连通分量。有向图的极大连通子图称为强连通分量。
9. 生成树,生成森林:一个有n个顶点的连通图的生成树是一个极小连通子图----它含有图中的所有顶点,但只有n-1条边。
非连通图中,每个连通分量得到一个极小连通子图---一颗生成树----生成森林。
二、图的存储表示
1. 数组表示法----邻接矩阵
一个一位数组存放顶点 信息,一个二维数组存放顶点之间的关系。(二维数组中的值,仅仅表示点之间的边或者弧的信息)
如果两个顶点没有直接连通,则对应值为0或∞
2. 邻接表表示法
用一个一位数组储存所有顶点,每个数组元素对应一个顶点,在每个数组元素后边接一个单链表,该链表储存与其相连接顶点的边或者弧。
3. 十字链表表示法:
既能方便求出出度,又能求入度。
每个顶点在逻辑上附带两个单链表:一个从该顶点射出的所有弧组成,具有相同的弧尾,一个由该顶点的所有接受弧组成,具有共同的弧头。
4. 邻接多重表:
无向图中,由顶点信息域和只想该顶点的第一条边的指针域。
三、图的基本操作及其实现(具体算法见于另一个博客)
1. CreateGraph(&G) ------ 创建图
2. LocateVex(G,u) ------ 返回顶点u的位置
3. FirstAdjvex(G,v) ------ 返回v的第一个邻接顶点
4. NextAdjvex(G,v,w) ------ 返回顶点v相对于顶点w的下一个邻接顶点
5. InsertVex(&G,v) ------ 添加新的顶点v
6. DeleteVex(&G,v) ------ 若图中存在顶点v,则删除
7. InsertArc(&G,v,w) ------ 插入依附于顶点v和w的弧<v,w>。
8. DeleteArc(&G,v,w) ------ 删除弧<v,w>
9. DFSTraverse(G,v) ------ 从顶点v开始深度优先遍历
10.BFStraverse(G,v) ------ 从顶点v开始广度优先遍历
四、最小生成树
连通网的最小代价生成树-----最小生成树
1.Prim(普利姆)算法。
2. Kruskal(克鲁斯卡尔)算法
权值为E中所存在边中最小的;
选取并连接后不得( ⊙ o ⊙ )使子网中构成环;
每条边最多只能选择一次。
五、关节点
重连同图:连通图中任意删除一个结点及其相关的边后,仍然是一个连通图。
删除某个结点及其相关联的边后,使得连通图被分成两个或者两个以上的连通分量,这样的结点称为关节点。
结论---一个图拥有关节点一定不是重连同。
图中顶点分类:
1. Vi是图的深度优先生成树的根节点,并且有两个或者两个以上的分支,则其必为连通图的关节点。
2. Vi只要有一颗子树的所有子孙结点都没有与Vi的祖先相同的回边,则Vi一定是关节点,每棵子树中至少有一个子孙节点有与Vi的祖先相同的回边,则Vi就不是关节点。
3. 如果Vi是深度优先生成树的叶子节点,则其不是关节点。
六、有向无环图的应用
1. 表达式的有向无环图:
2. 拓扑排序:
在有向图中选择一个没有前驱的顶点并将其输出;
从图中删除该顶点和它所发出的所有弧;
重复上述步骤直至图为空。
3. 关键路径:
(1) 关键路径:从源点到汇点的路径长度最长的路径叫关键路径。
(2) 活动开始的最早时间e(i)
(3) 活动开始的最晚时间l(i) 定义e(i)=l(i)的活动叫关键活动。
(4) 事件开始的最早时间ve(i)
(5) 事件开始的最晚时间vl(i)
七、最短路径
1. 源点到点的最短路径---迪杰特斯拉算法
1.1 如果源点与其他顶点有弧相连,则假定最短路径就是该弧。
1.2 从D中所有待定路径长度中选取最小值,则 v0到其所对应的顶点v的最短路径就是Dp中对应的元素值。
1.3 由于S中新增了顶点v,则使得不在S中的顶点讲v作为中转点,从而找到一条比当前待定最短路径更短的路径。
1.4 重复1.2,1.3直到所有路径都确定。
2. 每一对顶点之间的最短路径问题---弗洛伊德算法
1.1令有向网络的境界矩阵 为D,它对应的当前最短路径矩阵为Po.
1.2按照顶点1-n的顺序选取定点vk,重复执行一下步骤n次。直到更新停止。
1.3将顶点作为中转点插入到每一对顶点的当前最短路径当中并进行比较更新。