下面是求无向连同图最小生成树的一种算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
定理 2: 设 C 为任意一个圈,e’是圈中权最大的边,那么 G-{e’}中的 MST 也是 G 中的 MST。 证明: 设 T 为 G 的任意一棵 MST。如果 e’∈T,那么我们来证明可以构造出一个 MST 为 T’使 w(T)=w(T’),并且 e’不属于 T’。 因为 T 是 MST,那么 T-{e’}分成两个连通分支 G1,G2 设集合 S={ e | e∈G 且 e 的两端分别连接 G1 中的某个顶点和 G2 中的某个顶点} (1) e’为 S 中权最小的元素。 反证法:拿一个比 e’小的元素替换 e’,得到一个更小的生成树,矛盾。 (2) 圈 C 中,除了 e’,至少还有一条边 e’’∈S 设 e’连接的两个顶点为 A,B。从 C 中去掉 e’后,A,B 之间还有一条路径 p,不妨设 A∈G1,B ∈G2ห้องสมุดไป่ตู้所以,C 中至少有一条边连接 G1,G2。 (3) W(e’’)<=W(e’) W 表示权 因为 e’是圈中权最大的边 于是由(1)(2),得到 W(e’’)>=W(e’)。再由(3),得到 W(e’’)=W(e)。 于是,构造一棵树 T’=T-{e’}+{e’’}。显然,W(T’)=W(T),所以,T’是 G 的最小生成树,并 且并且 e’不属于 T’。
如果图 G 具有唯一最小支撑树,返回 true,否则返回 false.
算法:先求出一棵 MST,设为 T。 然后依次在 G 中去掉 T 的边 ei,对于每个图 G-{ei}。求出它的 MST 的权和 Wi 如果所有的 Wi 都大于 W(T),那么 G 的 MST 是唯一的,否则不唯一。 算法时间复杂度为 O(V^3) double SumOfWeight(Edge* T) {
double W=0; foreach (Edge e in T) {
W+=e.Weight; } return W; } //求一棵树的权和
bool uniqueMST(Graph &G) {
Edge* MST,TEMP; Prim(G,0,MST); //求一棵MST double W=SumOfWeight(MST),_W; //求MST的权和 foreach (Edge e in MST) {
if (G.Color[G.ToVertices(e)]==CL) return false; } return true; }
bool dfs(Graph& G,int V,bool CL) {
G.Mark[V]=VISITED; G.Color[V]=CL; for (Edge e=G.FirstEdge(V);G.IsEdge(e);e=G.NextEdge(e)) {
if (G.Mark[G.ToVertices(e)]==UNVISITED) if (dfs(G,G.ToVertices(e),!CL)==false) return false;
由定理(1)(2),每删去一条边后的 G-{e}的 MST 和原来的图 G 的 MST 权重相同。得证。
7.2 唯一最小支撑树 设计一个程序,判断给定无向连通图 G 是否存在唯一一棵最小支撑树。允许直接
调用 Prim 或 Kruskal 的最小支撑树算法。函数原型为: bool uniqueMST(Graph &G)
6.19 下面是求无向连同图最小生成树的一种算法 将图中所有边按权从大到小排序后为(e1,e2….em) i=1; while (所剩边数>顶点数) { 从图中删去 ei 如果图不连通,则恢复 ei I++ } 证明这个算法是正确的。
证明:
定理 1: 如果一条边 e 被删去了并且没有被恢复,那么被删去之前 e 一定在某一个环里,并且在这个 环中 e 的权最大。 证明: 设 e 被删之前的图为 G。 如果 e 被删去,并且没有被恢复,说明 e 被删除后图 G-{e}还是连通的。设 e 连接的两个顶 点为 A,B。那么 G-{e}中存在 A 到 B 的通路 p。于是在 G 中,p+{e}构成一个环。 显然,图 G 中,边的集合 p+{e}中任何一条边被删除都不会破坏 G 的连通性。因此,按照 已知条件,被删除的边 e 一定是 p+{e}中权值最大的一条边。
G.DeleteEdge(e); Prim(G,0,TEMP); _W=SumOfWeight(TEMP); if (_W==W) return false; G.AddEdge(e); } return true; }
思考题: 6.10 二分图:
二分图
非二分图
(2)判断一个连通图是否为二分图
算法:用 DFS,访问时用两种颜色标记结点。相邻的结点用不同的颜色。如果发现一个可以 到达的结点与当前结点同色,就不是二分图,否则是
相关文档
最新文档