Some modifications.
This commit is contained in:
@@ -248,7 +248,7 @@ bool Graph<Tv, Te>::tSort(int x, Stack<int> &S){
|
||||
|
||||
首先考虑一种较为一般的情况。考虑图G顶点集V,V的一个非平凡子集U以及U的补集V\U构成了G的一个割。最小支撑树总是会采用每一割的最短跨越边。
|
||||
|
||||
根据上面的性质,就可以得到构造最小支撑树的算法:总是将原图视作一个割,两个顶点集分别是已经加入到最小支撑树中的顶点和未加入的顶点。通过找到这个割的最短跨越边,从而将一个新的顶点加入到最小支撑树中。这样不断地迭代,知道最小支撑树覆盖了全图的所有顶点。
|
||||
根据上面的性质,就可以得到构造最小支撑树的算法:总是将原图视作一个割,两个顶点集分别是已经加入到最小支撑树中的顶点和未加入的顶点。通过找到这个割的最短跨越边,从而将一个新的顶点加入到最小支撑树中。这样不断地迭代,直到最小支撑树覆盖了全图的所有顶点。
|
||||
|
||||
这里比较复杂的问题是,如何快速地找到当前割的最短跨越边,为此,可以模仿dijkstra算法,维护一个数组,来保存所有未加入最小支撑树的顶点到最小支撑树的路径,每加入一个新的顶点,将这个数组进行更新。这里并没有真正地用一个数组,而是用每个顶点的`priority`字段来保存这个信息。
|
||||
|
||||
@@ -282,17 +282,17 @@ void Graph<Tv, Te>::primPU(int x){
|
||||
考虑从源点s到任意顶点v的最短路径,其路径上还有若干其他顶点。那么该路径上从s到这些顶点的一段,也是从s到这些顶点的最短路径。这个性质是容易证明的,因为否则的话,从s到v还有一条更短的路径,这与一开始的假设矛盾。
|
||||
|
||||
从上面的性质可以看出,为了构造从s到某一顶点的最短路径,首先需要构造从s到该顶点路径上更前面顶点的最短路径。将图中各点按距离s的远近次序由近到远排个序,就构成了最短路径子树序列。
|
||||
因此为了构造从源点s到所有其他顶点的最短路径,需要依次找到距离s最近的$u_1, $u_2, ..., u_k$,从而完成最短路径树的构造。
|
||||
因此为了构造从源点s到所有其他顶点的最短路径,需要依次找到距离s最近的$u_1, u_2, ..., u_k$,从而完成最短路径树的构造。
|
||||
|
||||
+ 首先需要找到距离s最近的顶点$u_1$。实际上,$u_1$是s的邻居中距离s最近的顶点。这是因为,倘若存在s的非邻居顶点$x$,距离s的距离比$u_1$更近,那么它必然通过某个顶点$y$与s连接,$y$是s的邻居顶点。所以,$x$到s的距离为
|
||||
$$
|
||||
dist(x, s) = dist(x, y) + dist(y, s)
|
||||
$$
|
||||
。而
|
||||
而
|
||||
$$
|
||||
dist(y, s) > dist(u_1, s)
|
||||
$$
|
||||
,所以$x$到s的距离实际上比$u_1$远,故$u_1$才是距离s最近的顶点。
|
||||
所以$x$到s的距离实际上比$u_1$远,故$u_1$才是距离s最近的顶点。
|
||||
|
||||
+ 已知$u_k$,找到接下来距离s最近的顶点$u_{k + 1}$。这个顶点就是所有的与
|
||||
s以及$u_1$到$u_k$连通的顶点中,距离s最近的一个。这个的证明和前面的原理一致,可以自己试试。
|
||||
|
||||
Reference in New Issue
Block a user