1,相关定义:
有向边也称为弧(Arc),<A,D>,A指向D,A是弧尾,D是弧头。
如果任意两个顶点之间都存在边,则称无向完全图/有向完全图,含有n个顶点的无向完全图/有向完全图有n*(n-1)*2……n*(n-1)条边。
带权图,又称网。
2,连通图
2.1 无向图:
如果对于图中任意两个顶点都是连通的,则称G是连通图。
无向图中的极大连通子图称为连通分量,条件:
1.要是子图;
2.子图要是连通的;
3.连通子图含有极大顶点数;
4.具有极大顶点数的连通子图包含依附于这些顶点的所有边。
2.2 有向图:
在有向图G中,如果对于每一对Vi , Vj ,从Vi 到Vj 都存在路径,则称G是强连通图。有向图中的极大强连通子图称作有向图的强连通分量。
2.3 连通图的生成树:
连通图的生成树的生成树是一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一棵树的n-1条边。(但是有n-1条边的不一定是生成树)
3,图的存储结构—邻接矩阵:
无向图:
有向图:
4,图的遍历
从图中某一顶点出发访遍图中其余顶点,且每个顶点仅被访问一次。
4.1 深度优先搜索DFS:
类似树的前序遍历,但这是针对连通图而言,从图的某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,知道图中所有和v有路径想吐的顶点都被访问。对非连通图,只需对它的连通分量分别进行深度优先搜索,若图中尚有顶点未被访问,则另选图中一个未曾访问的顶点作为起始点,重复上述步骤,直到所有顶点都被访问为止
4.2 广度优先搜索
5,最小生成树
最小生成树的边数必然是顶点数减一,|E| = |V| - 1;
最小生成树不可以有循环;
最小生成树不必是唯一的;
我们把构造连通图的最小代价生成树称为最小生成树(minimum cost spanning tree);
普里姆算法和克鲁斯卡尔算法,Prim算法和Kruskal算法。
Prim算法:先选一个结点,然后逐加入结点,加入与先有结点中任一结点最近的一个结点,O(V2),v为顶点数,如图:
Kruskal算法:逐一加边,O(eloge)
6,最短路径
6.1 迪杰斯克拉算法dijkstra(两结点之间最短路径)
邻接矩阵:
求解过程:
终点 |
从v0到个终点的D值和最短路径的求解过程 |
||||
i=1 |
i=2 |
i=3 |
i=4 |
i=5 |
|
V1 |
∞ |
∞ |
∞ |
∞ |
∞ 无 |
V2 |
10 (v0 ,v2) |
|
|
|
|
V3 |
∞ |
60 (v0 ,v2 ,v3) |
50 (v0 ,v4 ,v3) |
|
|
V4 |
30 (v0 ,v4) |
30 (v0 ,v4) |
|
|
|
V5 |
100 (v0 ,v5) |
100 (v0 ,v5) |
90 (v0 ,v4 ,v5) |
60 (v0 v4 ,v3 ,v5) |
|
Vi |
V2 |
V4 |
V3 |
V5 |
|
S |
(v0 ,v2) |
(v0 ,v4) |
(v0 ,v4 ,v3) |
(v0 v4 ,v3 ,v5) |
|
6.2 弗洛伊德算法(任一对结点最短路径)
每一对顶点之间的最短路径
Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。
Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。
Floyd-Warshall算法的原理是动态规划。设Di,j,k为从i到j的只以(1…k)集合中的结点为中间结点的最短路径的长度。
1.若最短路径经过点k,则Di,j,k= Di,k,k-1 + Dk,j,k-1
2.若最短路径不经过点k,则Di,j,k= Di,j,k-1
因此,Di,j,k= min{Di,j,k-1 , Di,k,k-1 + Dk,j,k-1}
在实际算法中,为了节约空间,可以直接在原来空间上进行迭代,这样空间可降至二维。
for k ← 1 to n do
for i ← 1 to n do
for j ← 1 to n do
if (Di,k + Dk,j < Di,j) then
Di,j ← Di,k + Dk,j;
其中Di,j表示由点i到点j的代价,当Di,j为 ∞ 表示两点之间没有任何连接。
D:表示距离
P:表示路径,即走过的路
D(-1),D(-0), D(1),D(2)分别表示(不经过其他结点,经过结点V0,经过结点V1,经过结点V2)四种情况。
D |
D(-1) |
D(-0) |
D(1) |
D(2) |
||||||||
0 |
1 |
2 |
0 |
1 |
2 |
0 |
1 |
2 |
0 |
1 |
2 |
|
0 |
0 |
4 |
11 |
0 |
4 |
11 |
0 |
4 |
6 |
0 |
4 |
6 |
1 |
6 |
0 |
2 |
6 |
0 |
2 |
6 |
0 |
2 |
5 |
0 |
2 |
2 |
3 |
∞ |
0 |
3 |
7 |
0 |
3 |
7 |
0 |
3 |
7 |
0 |
P |
P(-1) |
P(0) |
P(1) |
P(2) |
||||||||
0 |
1 |
2 |
0 |
1 |
2 |
0 |
1 |
2 |
0 |
1 |
2 |
|
0 |
|
AB |
AC |
|
AB |
AC |
|
AB |
ABC |
|
AB |
ABC |
1 |
BA |
|
BC |
BA |
|
BC |
BA |
|
BC |
BCA |
|
BC |
2 |
CA |
|
|
CA |
CAB |
|
CA |
CAB |
|
CA |
CAB |
|
7,拓扑排序
可得多个拓扑排序序列:(C1, C9 , C4 , C2 , C3 , C5 , C7 , C10 , C11 , C12 , C6 , C8 )
8,关键路径
路径长度最长的路径叫做关键路径
AOE-网是一个带权的有向无环图,顶点表示事件,弧表示活动,权表示活动持续的时间。
例如:
注:
活动l-e=0,则a2 、a5 、a7是关键活动;
取ve=vl的顶点:关键路径为(v1, v3, v4, v6)
关键路径: