洛咕博客地址:−&gt;ClickHere&lt;−-&gt;Click Here&lt;-−>ClickHere<−,求捧场


最近想找最小生成树的题做,奈何难度有限,点进的蓝题紫题都和“生成树”么得什么关系……于是就莫名找到了一道最小树形图的题,然后当然不会辣……

瞎学了一下,还是啥都不会,但毕竟咱们有时间,磨了一会儿总算是懂了一点……

进入正题好了……


定义

说实话我到现在都不是很懂定义……

大概就是给定一张有向图,指定根节点rootrootroot,求出一棵有向树,使选出的边的权值和最小

首先肯定是要把所有点都选上的……不然这题目还有什么意义……

然后是有向树……说明根节点的入度肯定是000,其他店的入度最多为111,出度都无所谓,这点很明显

然后就是怎么求了……


朱-刘算法

姑且不要吐槽这个名字了……虽然有点奇怪

朱刘算法的核心是啥呢?又是贪心哦……

(为什么要说“又”呢?因为之前写的EKEKEK也是贪心……)

首先根据定义我们可以发现,每个非根节点的入度最多且必定为111,那么我们就对每条边的终点贪心地选择权值最小的一条边

此时,选出来的一些边并不一定会是一棵树,不过可能会有的出现,所以我们把这些环缩点(这里不用TarjanTarjanTarjan,根据选中边从终点向起点就行),然后重复这个过程

不过要注意的是,我们在找环之前是会加上连向该点的边的权值的,如果要把连向该点的边换一条的话,需要加上的就不是这另一条边的权值,而是另一条边的权值减去原本的边的权值,这样不方便计算,所以我们先把边的权值减去原本的边的权值就行

这样说可能很混乱……代码见吧……


朱-刘算法求最小树形图模板\text{\huge朱-刘算法求最小树形图\quad 模板}朱-刘算法求最小树形图模板

bool ZhuLiu()
{while(1){tot=0;//缩点后重置memset(bel,0,sizeof(bel));memset(f,0,sizeof(f));memset(minx,60,sizeof(minx));for(int i=1;i<=m;i++){int u=e[i].u,v=e[i].v;if(u^v && minx[v]>e[i].dis)//对每条边的终点选一条连向它的权值最小的边{minx[v]=e[i].dis;faz[v]=u;//记录到终点的边的起点}}minx[rt]=0;for(int i=1;i<=n;i++)//枚举每个点,缩点{int u;if(minx[i]==inf) return 0;//如果没有连向它的边就跳过ans+=minx[i];//加上答案for(u=i;u!=rt && f[u]!=i && !bel[u];u=faz[u]) f[u]=i;//此处的f数组存储的是每个缩过的环内的“标志节点”,类似并查集,但在模板题只是提供了是否被查询过的信息if(u!=rt && !bel[u])//如果有环把环内每个点标上号{bel[u]=++tot;for(int v=faz[u];v!=u;v=faz[v]) bel[v]=tot;}}if(!tot) return 1;//没有的话代表是一颗树了,退出即可for(int i=1;i<=n;i++) if(!bel[i]) bel[i]=++tot;//把剩下的一些节点也缩了for(int i=1;i<=m;i++){int w=minx[e[i].v];e[i].u=bel[e[i].u];e[i].v=bel[e[i].v];int u=e[i].u,v=e[i].v;if(u!=v) e[i].dis-=w;//把每条可能被选择的边减去当前选的最短边权值,等下如果要选择直接加上权值就行了}n=tot;rt=bel[rt];}
}

写的很渣,欢迎找BugBugBug


Fin.Fin.Fin.

最小树形图——朱刘算法相关推荐

  1. poj3164(最小树形图朱刘算法模板)

    题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...

  2. 生成树最小树形图 -- 朱刘算法详解

    本文借鉴的博文: zephyr_pro dalao的blog 朱刘算法引入: (把一道最小树形图当作最小生成树来做了,wa了后以为是bug像个sb一样d了半天) 最小树形图和最小生成树都是要求总权值最 ...

  3. bzoj 4349: 最小树形图 朱-刘算法

    最裸的最小树形图(←现在才学的弱渣). 显然只需要打一下一个堡垒,然后剩下的可以最后用最小的代价再打. 然后只要把图建出来跑一下朱-刘算法即可. 简单讲一下朱-刘算法吧(思想还是很简单的),下面只考虑 ...

  4. 最小树形图-朱刘算法详解 +例题解析

    文章目录 最小树形图 定义 和最小生成树的区别 朱刘算法 思想 步骤 流程展示 算法实现 例题 POJ3164_Command_Network HDU2121_Ice_cream's_world_II ...

  5. NOIP模拟题 通讯 强连通分量缩点 最小树形图--朱刘算法

    通讯 (message.cpp\c\pas) [问题描述] "这一切都是命运石之门的选择." 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短信,并由此得知了伦 ...

  6. [UVA - 11865]Stream My Contest(最小树形图+朱刘算法)

    本题过于简单,朱刘算法模板题,考虑二分一下带宽即可 title code title code #include <cstdio> #include <cstring> #in ...

  7. 最小树形图+朱刘算法

    大题上完整的朱.刘算法是由四个大步骤组成的: 1.求最短弧集合E 2.判断集合E中有没有有向环,如果有转步骤3,否则转4 3.收缩点,把有向环收缩成一个点,并且对图重新构建,包括边权值的改变和点的处理 ...

  8. 最小树形图(朱刘算法)

    不好意思 时间比较短,下面应该还会有修订的= = , 那段话是我复制过来的,觉得挺好的就用一下. 下面是讲解(不理解一的时候 , 可以看看二 ,结合图片): 一:   最小树形图,就是给有向带权图中指 ...

  9. 最小树形图——朱刘算法学习小记

    参考资料: https://www.cnblogs.com/hdu-zsk/p/8167687.html https://www.luogu.com.cn/blog/xiaojiji/solution ...

最新文章

  1. 求主析取范式与主合取范式
  2. formal method第10课
  3. 基于TCP协议的通信模型
  4. C#实现异步消息队列
  5. 禁止程序接收鼠标事件的工具_报表工具html事件--鼠标悬停出现提示信息
  6. LeetCode Algorithm 剑指 Offer II 056. 二叉搜索树中两个节点之和
  7. sun.misc.Unsafe苦难告诉我们什么
  8. react fiber_让我们爱上React Fiber
  9. python实现k均值算法_python实现kMeans算法
  10. Socket 编程之_TCP ☎☎☎
  11. Left join ,Right join ,inner join 的运行结果的区别
  12. python实现tkinter可视化一
  13. 单片机练习 - 计时器
  14. 计算机硬盘 u盘和光盘属于,磁盘U盘光盘的区别
  15. linux-磁盘管理
  16. PS 曲线(改变图片不同的色彩效果)
  17. 夏威夷大学计算机专业排名,美国夏威夷大学排名
  18. h2o.ai源码解析(1)—项目简介
  19. 2021-2027全球与中国可待因止疼药市场现状及未来发展趋势
  20. 关爱残障儿童,天使之翼爱心活动进行

热门文章

  1. 计算机正确的坐姿教案,【幼儿园坐姿教案】幼儿园大班坐姿教案_关于幼儿坐姿的教案_亲亲宝贝网...
  2. ESP8266 发送数据和接收数据(万能模板)
  3. cocos2d中getasynckeystate android,分析Cocos2d-x横版ACT手游源代码 4、场景
  4. git rebase -i_git rebase -i改变生活的魔力
  5. 浪漫约定的守护者——微软最有价值专家余勇
  6. Flash之SM25QH128M、JFM25F32A读写操作FPGA Verilog实现
  7. time of our lives---从世界杯主题曲看厚脸皮的德国人:)
  8. 安装教程之Visual C++6.0的安装
  9. 深度理解GET和POST两种基本请求方法的区别
  10. python获取json中的某个值_json文件返回数据中提取数据的方法(JSON数据取其中某一个值的方法)...