算法描述:

从T=NULL开始

for (图中的每条边e)

if(加入e不构成环,则T=T+e)

else e'是环上权重最大的边,T=T+e-e‘

算法实现

可以看出上述的算法的关键之处就在于判断图中是否存在环以及找到环中最大的边。

判断是否有环:

用dfs深度优先搜索,如果搜索过程中发现一个点u的邻接点v是灰色的,则说明这条边(u,v)是后向边。

找到环中最大边:

从u开始寻找他的前驱点π[u],直到前驱点为v时停止,这过程中的所有点就是环中的所有的点。然后再求出最大的边就好了。

int linkedDgraph1::DFSCircle(int *res)
{int maxWeight = -1;time = 0;//计时器for (int i = 0; i < 10000; i++){color[i] = WHITE;dTime[i] = 0;fTime[i] = 0;precursor[i] = 0;low[i] = 0;}for (int i = 0; i < verticeNumber; i++){int u = point[i];if (color[u] == WHITE){bool exist = false;int uu = 0;int vv = 0;DFSCircleVisit(u,exist,uu,vv);if (exist)//存在环{maxWeight = getWeight(vv,uu);int point1 = precursor[uu];//暂时保存前驱点while (point1 != vv)//当前驱点不等于起始点时{int temp = getWeight(point1, uu);//获取权值并进行比较if (maxWeight < temp){maxWeight = temp;res[0] = uu;res[1] = point1;}uu = point1;point1 = precursor[point1];}int temp = getWeight(point1, uu);if (maxWeight < temp){maxWeight = temp;res[0] = uu;res[1] = point1;}break;}}}return maxWeight;
}void linkedDgraph1::DFSCircleVisit(int u,bool &exist,int &uu,int &vv)
{time += 1;dTime[u]  = time;color[u] = GRAY;graphNode<int> *p = Adj[u].first();while (p != NULL){int v = p->element;if(precursor[u]!=v){ if (color[v] == WHITE)//如果点是白色的{precursor[v] = u;DFSCircleVisit(v,exist,uu,vv);//cout << u << "-->" << v << endl;}if (color[v] == GRAY)//如果点是灰色的,说明有后向边即构成环{exist = true;uu = u;vv = v;}}p = p->next;}color[u] = BLACK;time += 1;fTime[u]  = time;
}

最后的生成树的代码:

void linkedDgraph1::Lsmst(linkedDgraph1 &G1)
{for (int i = 0; i < verticeNumber; i++){int u = point[i];graphNode<int> *p = Adj[u].first();while(p!=NULL){int v = p->element;int temp = getWeight(u, v);G1.insertEdge(u, v, temp);G1.insertEdge(v, u, temp);int *a = new int[2];//保存结果temp = G1.DFSCircle(a);if (temp != -1)//如果加入有环{G1.eraseEdge(a[0],a[1]);G1.eraseEdge(a[1], a[0]);}p = p->next;}}
}

局部替换算法最小生成树相关推荐

  1. 双目立体匹配 等 算法 论文 综述 全局局部算法 CSCA NLCA SegmentTree树 DoubleBP Belief-Propagation AD-Census SGM

    双目立体匹配 等 算法 论文 综述 本文GITHUB 博文末尾支持二维码赞赏哦 _ 双目立体视觉技术实质就是模拟人的双眼视觉处理系统来处理通过摄像机采集所 获取的图像,它利用两台或多台摄像机在一定约束 ...

  2. 【操作系统与安全】考点总结

    复习课1回放 1:52:45开始 复习课2回放 1:16:50开始有画面 所有材料PDF版 文章目录 复习课2 题型 简答[摘抄自课本/网络,仅供参考] 应用 复习课1 U1 操作系统概述 U2 处理 ...

  3. 南开大学 软件学院 操作系统 李旭东老师 复习

    本人复习时总结的重点和李旭东老师上课提及的重点 比较乱,且每年情况不一样,仅供参考 课堂上画的重点 类 unix 系统.类 linux 系统(5个).类 windows debian.gentoo.u ...

  4. 生成树、最小生成树的一些性质以及邻域的概念

    设一个无向连通图G=(V,E),顶点个数记作m,边的数量为n.其对应的最小生成树记作f. 则生成树T的性质有: 边数量为m-1 没有圈 加入任何一条边都会形成一个圈 对于一颗生成树T,定义 操作:在其 ...

  5. 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal#39;s algorithm)

    克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...

  6. 最小生成树算法详解(prim+kruskal)

    最小生成树概念: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里 ...

  7. 最小生成树(Prim、Kruskal)算法,秒懂!

    前言 在数据结构与算法的图论中,(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法.但是可能很多人对概念不是很清楚,什么是最小生成树? 一个有 n 个结点的连通图的生成树是原图的极小连通子 ...

  8. 数据结构之图:加权无向图与寻找最小生成树,Python——27

    加权无向图与prim算法和Kruskal算法寻找最小生成树 加权无向图的介绍 引入 加权无向图是一种为每条边关联一 个权重值或 是成本的图模型.这种图能够自然地表示许多应用.在一副航空图中,边表示航线 ...

  9. 贪婪算法在求解最小生成树中的应用(JAVA)--Prim算法

    贪婪算法:通过一系列步骤来构造问题的解,每一步对目前构造的部分分解做一个拓展,直到获得问题的完整解为止,而算法的核心思想就在于,算法的每一步都必须满足以下条件:可行(满足问题的约束条件).局部最优(当 ...

  10. 个人总结---连通图的最小生成树算法

    最近在复习数据结构和算法的的内容,栈和队列的思想是比较深刻,借于许多高级语言都有相应的框架实现了栈和队列链表等,所以对于这一类,我们只需要了解其思想,在真正操作时,也会显得比较简单.但是还有一类数据结 ...

最新文章

  1. vue 圆形百分比进度条_快速构建一个圆形的进度条
  2. java 回车 按钮事件,java--键盘事件类,按下回车则模拟鼠标
  3. JavaScript 页面跳转的几种方式
  4. Win10 Build 11099和11102的更动超过1200项
  5. 解决笔记本重装问题(VISTA系统改为XP系统)
  6. 《鸿蒙理论知识06》HarmonyOS概述之应用开发基础知识
  7. WINCE的BIB文件解析
  8. 《大数据》2015年第2期“动态”——大数据发现银行贷款风险
  9. Transformer 的稳健性更好吗?
  10. 为什么本地图片都不能直接浏览器_抖音精选答疑解惑!你的视频为什么不能被下载?...
  11. Java常用类库-AutoCloseable
  12. Docker和Ubuntu主机互传复制文件
  13. Dbf文件转Excel
  14. 记录一次线上mysql事务隔离级别引发的思考
  15. 三星笔试2013笔试杂说
  16. java常用的对象转map的几种方式
  17. 朗文3000词汇表带音标_SBS朗文国际英语教程第二册单词表(带音标)
  18. lamp一键配置 --转自秋水
  19. 《Multiobjective Evolutionary Algorithms:A Comparative Case Study and the Strength Pareto Approach》
  20. 衡山湘大学计算机学校,南岳衡山烧香求学业显灵感恩南岳大庙祈福考上985双一流重点大学...

热门文章

  1. 计算机考研和软件的区别吗,考研考计算机与考软件有什么区别
  2. (六)【模电】(基本放大电路)静态工作点的稳定
  3. ESP-MESH 无线组网,让智能家居通信组网更方便 | ESP32轻松学(Arduino版)
  4. 匠心独运解读Mybatis源码,纯手工打造开源框架
  5. 双重for循环 语法结构
  6. clusters(clusters)
  7. 春招面经总结(获携程Offer)
  8. HUAWEI 机试题:统计射击比赛成绩
  9. kafka常见异常问题总结:KeepErrorCode = NoNode for...
  10. INTO CORRESPONDING FIELDS OF、去掉前导零,增加前导0。不显示物料号的前导零