【概述】

最小树形图,就是给出一个带权有向图,从中指定一个特殊的结点 root,求一棵以 root 为根的有向生成树 T,且使得 T 中所有边权值最小。

简单来说,最小树形图就是有向图的最小生成树。

【朱刘算法】

1.过程

简单来说,朱刘算法分为四个过程:

1)求最短弧集合 E

2)判断集合 E 中有没有有向环,如果有转步骤 3,否则转 4

3)收缩点,把有向环收缩成一个点,并且对图重新构建,包括边权值的改变和点的处理,之后再转步骤 1

4)展开收缩点,求得最小树形图

2.实现

struct Edge{int x,y;int w;
}edge[N];
int vis[N];
int id[N];//结点所属环编号
int in[N],pre[N];//in[]为最小入边权,pre[]为其对应的起点
int zhuLiu(int root,int n,int m){//root结点、点数、边数int res=0;//最小树形图总权值while(true){for(int i=0;i<n;i++)//初始化为无穷大in[i]=INF;//寻找每个点的最小入边for(int i=0;i<m;i++){//遍历每条边int x=edge[i].x;int y=edge[i].y;if(edge[i].w<in[y] && x!=y){//更新最小入边pre[y]=x;//记录前驱in[y]=edge[i].w;//更新}}//判断是否存在最小树形图for(int i=0;i<n;i++){if(i==root)continue;if(in[i]==INF)//除根节点外的点存在孤立点return -1;}//寻找所有的环int cnt=0;//记录环数in[root]=0;memset(id,-1,sizeof(id));memset(vis,-1,sizeof(vis));for(int i=0;i<n;i++){//标记每个环res+=in[i];//记录权值int y=i;while(vis[y]!=i&&id[y]==-1&&y!=root){//寻找图中有向环//三种情况会终止:找到出现同样标记的点、结点已属其他环、遍历到根vis[y]=i;//标记y=pre[y];//向上找}if(y!=root&&id[y]==-1){//没有遍历到根或没有找到结点属于其他环,说明找到有向环for(int x=pre[y];x!=y;x=pre[x])//标记结点x为第几个环id[x]=cnt;//记录结点所属环号id[y]=cnt++;//记录结点所属环号并累加}}if(cnt==0)//无环break;for(int i=0;i<n;i++)//可能存在独立点if(id[i]==-1)//环数累加id[i]=cnt++;//建立新图,缩点重新标记for(int i=0;i<m;i++){int x=edge[i].x;int y=edge[i].y;edge[i].x=id[x];edge[i].y=id[y];if(id[x]!=id[y])//两点不在同一环内,更新边权值edge[i].w-=in[y];//x到y的距离为边权-in[y]}n=cnt;//以环数为下次操作的点数,继续上述操作,直到无环root=id[root];}return res;
}
int main(){int n,m;//n个点m条有向边scanf("%d%d",&n,&m);for(int i=0;i<m;i++){//建图scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].w);if(edge[i].x==edge[i].y)//除去自环,即点到自身距离为INFedge[i].w=INF;}int res=zhuLiu(0,n,m);if(res==-1)printf("No\n");elseprintf("%d\n",res);return 0;
}

图论 —— 生成树 —— 最小树形图相关推荐

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

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

  2. 图论 —— 生成树 —— 最小瓶颈生成树

    [概述] 所谓瓶颈生成树,即对于图 G 中的生成树树上最大的边权值在所有生成树中最小. 对于无向图来说,无向图的最小生成树一定是最小瓶颈生成树,但最小瓶颈生成树不一定是最小生成树. 因此,使用 Kru ...

  3. 图论 —— 生成树 —— 最小瓶颈路

    [概述] 最小瓶颈路是指:在一张无向图上,对于点 u.v 找出从 u.v 的一条简单路径,使得路径上行所有边中最大值最小. 根据查询次数不同,最小瓶颈路问题可分为单次查询和多次查询. [单次查询] 由 ...

  4. NOI数据结构:最小树形图

    最小树形图-朱刘算法详解 +例题解析 最小树形图-朱刘算法详解 +例题解析_pursuit的博客-CSDN博客_最小树形图 图论 -- 生成树 -- 最小树形图 图论 -- 生成树 -- 最小树形图_ ...

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

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

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

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

  7. [POJ 3164]Command Network(最小树形图,朱刘算法)

    文章目录 title solution code title solution 读完翻译后,很明显就是个朱刘算法的板子题 最小树形图,就是给出一个带权有向图 从中指定一个特殊的结点 root 求一棵以 ...

  8. hdu-4966 GGS-DDU 最小树形图

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4966 题意: 给你n门课的最高等级及m条升级方法,开始时你每门课的等级都在等级0,升级方法的5个参数代 ...

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

    洛咕博客地址:−>ClickHere<−->Click Here<-−>ClickHere<−,求捧场 最近想找最小生成树的题做,奈何难度有限,点进的蓝题紫题都和& ...

最新文章

  1. php传递JSON数据
  2. 数据中心新认证出现,UPTIME面临挑战
  3. [Machine Learning] logistic函数和softmax函数
  4. 腾讯TEG校招群聊天记录曝光,速来围观!
  5. 深度概览卷积神经网络全景图,没有比这更全的了!
  6. 多媒体领域顶会,ACM MM 2020 会议论文下载
  7. 少走弯路的十条忠告收藏
  8. libpcap 中的 struct block
  9. 1.深入理解计算机系统---计算机系统漫游
  10. FAT32文件系统介绍
  11. Houdini输出ABC到UE4识别材质
  12. 谷歌浏览器提示Flash版本过低,要求更新或运行一次
  13. 前端开发工程师就业时应该选择大公司还是小公司?这是我听过最靠谱的答案!
  14. 罗振宇4小时跨年演讲精华版:大环境里的7个行动策略
  15. Ol4网格生成以及优化
  16. K-means(K均值)
  17. Maya照明大师班:成为渲染专家
  18. 超详细的k8s对接ceph RBD存储
  19. 新视野大学英语读写教程第四册 答案
  20. 绝对隐私:华为公司员工待遇全面揭秘(转)

热门文章

  1. [古诗十九首] 西北有高楼 —— 无名氏
  2. Windows 95被做成了一款软件,可玩扫雷和纸牌
  3. 2030年春节,你会跟机器人一起过吗?
  4. 避开10个面试大坑,接offer成功率提升至99%
  5. 我手撸了一个划线翻译工具!
  6. WePY,微信小程序开发利器,进一步简化小程序开发难度
  7. 微信分享JS-SDK示例页面
  8. JEECG 引领J2EE新开发模式插件式开发 - 公开课2013-12-12
  9. C#中的i++和++i
  10. 人工智能大脑如何调控智能交通“疏堵”?