【最小树形图+带LAZY的可并堆】poj3164

本文介绍了一种解决有向图最小树形图问题的刘朱算法。该算法能在有向图中找到一棵有根树,使得这棵树的边权之和最小。文章详细描述了算法的基本流程,包括如何处理环路,以及如何利用数据结构优化算法复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:最小树形图;

最小树形图:给你一个带权有向图,选出一些边构成一颗有根树,并使得这棵树的边权之和最小;

 

大家都知道最小生成树的算法是prim和Kruskal,但是如果是有向图呢?萎了吧。。。这时候NB的刘朱算法就出现了,太IMBA了!

 

 

下面为基本流程.

最小树形图模型首先给定点集和一个根,若干条带权有向边,求从根出发的一个子图,边数为N-1,能从根到所有节点,并且边权和最小.

首先可以肯定的是,如果这个图从根走一遍后发现不连通,那么肯定无最小树形图.

否则每个仍在图中的点i记对于i点的最小权入边对应的入点为pre[i]

如果没有环,直接将所有cost[pre[i],i]相加记为ans

否则,缩环为点,记环为v,环上的任意点位vv,不在环上的任意点为u,将环上的边权和加入ans,改cost[v,u]=min{cost[vv,u]},cost[u,v]=min(cost[u,vv]-cost[pre[vv],vv])

再继续修改pre[i],并判断还有没有环.

这样改造后,对于任意一个环,最后加上某条入这条环的边,因为边权的改造,必将消去环上一条边,使得最小树形图中边位N-1且连通所有点.

from ly

 

 

这个算法的复杂度最坏是O(NM)的,后来灵机一动,发现可以用可并堆来实现O(logN)的时间查找最小值边权,至于修改操作,我很有创意地发明了个带LAZY标号的可并堆。

具体实现是用的斜堆,这样这道题的复杂度就通过数据结构优化成了O(N2logN)。但是由于LAZY标记的常数和斜堆本身带有2的常数以及我编丑了。。。

所以时间复杂度还是比较高的。

 

不过总的来说还是在POJ的前几名,不知道前面的大牛是靠漂亮的常数还是乱七八糟优化法才刷到那么快的速度。

 

代码:

 

 

### 使用 Vue 和 Element UI 实现树形 Element UI 提供了一个名为 `el-tree` 的组件,用于创建树形结构的数据展示。以下是关于如何使用 Vue 和 Element UI 创建树形的具体方法。 #### 安装依赖 为了使用 Element UI 中的 `el-tree` 组件,首先需要安装 Element UI 库。可以通过 npm 或 yarn 来完成安装: ```bash npm install element-ui --save ``` 或者 ```bash yarn add element-ui ``` 接着,在项目的入口文件中引入注册 Element UI[^1]。 ```javascript import Vue from 'vue'; import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; Vue.use(ElementUI); ``` #### 基本配置与数据绑定 `el-tree` 需要通过 `data` 属性来传递树形结构的数据源。通常情况下,这些数据是一个嵌套的对象数组,其中每个对象可以包含子节点列表(通常是 `children` 字段)。下面是一个简单的例子: ```html <template> <div id="app"> <el-tree :data="treeData" node-key="id" default-expand-all></el-tree> </div> </template> <script> export default { data() { return { treeData: [ { id: 1, label: "父节点", children: [ { id: 2, label: "子节点一" }, { id: 3, label: "子节点二" } ] } ] }; } }; </script> ``` 上述代码展示了如何定义一个基本的树形结构,将其渲染到页面上。这里的关键属性包括: - **`:data`**: 数据源,指定树形结构的内容。 - **`node-key`**: 每个树节点用来作为唯一标识的属性名,默认为 `id`。 - **`default-expand-all`**: 是否默认展开所有节点[^2]。 #### 动态加载数据 如果希望在点击某个节点时动态加载其子节点,则可以利用懒加载功能。这需要设置 `lazy` 属性为 true 提供 `load` 方法来异步获取数据。 ```html <template> <div id="app"> <el-tree :props="treeProps" :load="loadNode" lazy show-checkbox ></el-tree> </div> </template> <script> export default { data() { return { treeProps: { label: "name", // 自定义字段名称 isLeaf: "leaf" // 判断是否为叶子节点 } }; }, methods: { loadNode(node, resolve) { if (node.level === 0) { return resolve([ { name: "区域A", leaf: false }, { name: "区域B", leaf: false } ]); } setTimeout(() => { const nodes = Array.from({ length: Math.ceil(Math.random() * 5) }, (_, i) => ({ name: `${node.data.name}-${i}`, leaf: Math.random() > 0.5 }) ); resolve(nodes); }, 500); // 模拟延迟请求 } } }; </script> ``` 此示例演示了如何通过自定义函数 `loadNode` 加载子节点数据。注意这里的 `resolve` 函数是用来通知框架已经完成了数据加载操作[^3]。 #### 样式定制 除了基础的功能外,还可以进一步调整样式以满足特定需求。比如改变字体大小、颜色或者其他视觉效果都可以借助 CSS 类选择器实现。 ```css /* 修改整个 el-tree 的背景色 */ .el-tree-node__content { background-color: #f9fafc; } /* 当鼠标悬停时高亮显示 */ .el-tree-node:focus > .el-tree-node__content { color: blue; } ``` 以上就是基于 Vue.js 和 Element UI 构建树形表的主要方式及其一些高级特性介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值