图的应用:
…
最小生成树:(Minimum-Spanning-Tree, MST)
**定义:**设R为G的所有生成树的集合,若T为R中边的权值之和最小的那棵生成树, 则 T 称为 G 的最小生成树。
特点:
①最小生成树不是唯一的,即最小生成树的树形不唯一,R中可能有多个最小生成树。
②最小生成树的边的权值之和总是唯一的。
③最小生成树的边数为顶点数减 1。
普里姆(Prim)算法:
算法思想: N={V, E} 是连通网,算法从V’{u0},E’{}开始,
从所有u属于V’,v属于V-V’中找到一条权值最小的边(u,v)并入集合E’,v并入集合V’。
重复此过程,直到V’=V。
void prim(G,T)
{
T=空集;
U={w};//从任意顶点开始
while(V-U!=空集)//若树中不含全部顶点
{
设(u,v)是使 u属于U 与 v属于(V-U),且权值最小的边;
T=T∪(u,v); //边入树的边集
U=U∪{v}; //顶点归入树
}
}
时间复杂度: O(IVl2),不依赖于IEI。
适用性:求解边稠密的图的最小生成树。
克鲁斯卡尔(Kruskal)算法:
算法思想: N={V, E} 是连通网,算法从V’=V,E’{}开始
按边的权值的递增顺序依次从E-E’中选取一条边。若不构成回路,则将其加入E‘,否则舍弃。
void Kruskal(V,T)
{
T=V;
numS=n; //连通分量的个数
while (numS>1)
{
从E中取出权值最小的边(v,u);
if (v和u属于T中不同的连通分量)//不构成回路
{
T=T∪{ (v, u)};
numS--;
}
}
}
**时间复杂度:**通常在 Kruskal 算法中,采用堆来存放边的集合,则每次选择最小权值的边只需 O(loglEI)的时间。
生成树 T 中所有边可以看作一个等价类, 每次添加新的边的过程类似于求解等价类的过程
由此可以采用并查集的数据结构来描述 T,从而构造 T 的时间复杂度为 O(IElloglEI)。
适用性:适合于边稀疏而顶点较多的图。
…
最短路径:
对于无权图,可以用广度优先搜索求最短路径。
对于有权图,把从一个 顶点到图中其余任一个顶点 vi的一条路径(可能不止一条)上所经过边上的权值之和
定义为该路径的带权路径长度。
分为
①单源最短路径(Dijkstra)
②每一对顶点间的最短路径(Floyed)
Dijkstra算法:
Floyed算法:
…
拓扑排序:
**AOV网:**如果图G表示一个工程,其顶点表示活动,用有向边<Vi, Vj>表示活动Vi必须先于活动Vj进行的这样一种关系
则将这种有向图称为顶点表示活动的网络,记为 AOV 网。
拓扑排序::在图论中,由一个有向无环图的顶点组成的序列, 当且仅当满足下列条件时,称为该图的一个拓扑排序。
①每个顶点出现且只出现一次。
②若顶点 A 在序列中排在顶点 B 的前面,则在图中不存在从顶点 B 到顶点 A 的路径。
…
关键路径:
**AOE网:**在带权有向图中,以顶点表示事件,有向边表示活动,边上的权值表示完成该活动的开销 (如 完成活动所需时间)
则称这种有向图为用边表示活动的网络, 简称为 AOE 网。
①只有在某顶点所代表的事件发生后,从该顶点出发的各有向边 所代表的活动才能开始
②只有在进入某一顶点的各有向边所代表的活动都己经结束时, 该顶点 所代表的事件才能发生。
**关键路径:**从源点到汇点的所有路径中,具有最大路径长度的路径称为关键路径。 把关键路径上的活动称为关键活动。
五个参数:
①事件 vk 的最早发生时间 ve(k) 开始顶点 V 到 vk 的最长路径长度。
②事件 vk 的最晚发生时间 vl(k) 即保证它所指向的事件 Vi在 ve(i)时刻能够发生时,该事件最迟必须发生的时间。
③活动ai的最早开始时间 e(i) 它是指该活动的起点所表示的事件最早发生时间果边<vk,vi>表示活动衔,
则有e(i)=ve(k)。
④活动ai的最晚开始时间 l(i) 该活动的终点所表示的事件最迟发生时间与该活动所需时间之差
有 l(i)=vl(j)-Weight(vk,vj)。
⑤ 一个活动ai的最迟开始时间 l(i)和其最早开始时间 e(i)的差额 d(i)=l(i)-e(i) 所有 d(i)=0的活动构成关键路径。