联合权值——o(n)做法

本文介绍了一种图算法的优化方案,通过存储每个顶点关联顶点的权值和而非具体的图片,来减少内存消耗并提高计算效率。这种方法适用于解决特定类型的图论问题,如寻找最大值路径和计算所有路径的总权值。

szj想了个没有存图的做法,存了每个顶点所关联顶点的权值和。例如,顶点1关联顶点a1,a2,a3;则第一条边是a1,第二次是a1*a2,第三次就是a3*(a1+a2)

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

const int MaxN=200000;
const int MOD=10007;

int n;
long long  f[MaxN],t[MaxN];
long long  value[MaxN],vs[MaxN];
long long sum[MaxN],Max[MaxN];

int main(){

    scanf("%d",&n); 
    for(int i=1;i<=n-1;++i){
        scanf("%lld%lld",f+i,t+i);
    }
    for(int i=1;i<=n;++i){
        scanf("%lld",value+i);    
    }
    
    long long ans1=0,ans2=0;
    for(int i=1;i<=n-1;++i){
        ans1=max(ans1,max(Max[f[i]]*value[t[i]],Max[t[i]]*value[f[i]]));//求最大值
          ans2=(ans2+(value[f[i]]*sum[t[i]])+(value[t[i]]*sum[f[i]]));//求总和
        sum[f[i]]+=value[t[i]];
          sum[t[i]]+=value[f[i]];
          Max[f[i]]=max(Max[f[i]],value[t[i]]);
          Max[t[i]]=max(Max[t[i]],value[f[i]]);
    }
        
    
    printf("%lld %lld\n",ans1,2*ans2%MOD);
    
    return 0;    
}



哈夫曼树(Huffman Tree),也称为最优二叉树,是一种带权重的二叉树,用于数据压缩。它的构建过程通常通过贪心算法实现,即每次选择两个权值最小的节点合并成一个新的节点,新节点的权值为其子节点权值之和,直到所有节点合并成一棵树。 以下是简化的步骤和代码实现: 1. **构建哈夫曼树**: - 创建一个空的优先级队列(最小堆)。 - 将每个字符及其对应的权值(频率)作为一个键值对(通常是字典序)添加到队列中。 - 当队列中有至少两个元素时,从未排序队列中取出权值最小的两棵树进行合并,形成新的节点,然后将新节点放回队列中。 - 重复此过程,直到只剩下一个节点,这就是哈夫曼树的根。 2. **生成哈夫曼编码**: - 遍历哈夫曼树,从根开始记录路径。遇到左分支标记为0,右分支标记为1。当到达叶子节点时,得到的就是该字符的哈夫曼编码。 3. **译码**: - 输入二进制编码时,从左到右逐位解析,根据读取的比特流在树上进行匹配。遇到1就走右边,遇到0走左边。最终落在哪棵叶子节点,对应的字符就是解码的结果。 以下是一个Python示例(简化版): ```python from heapq import heappush, heappop class Node: def __init__(self, char, freq): self.char = char self.freq = freq self.left = None self.right = None def build_huffman_tree(freqs): heap = [] for char, freq in freqs.items(): node = Node(char, freq) heappush(heap, (freq, node)) while len(heap) > 1: left_freq, left_node = heappop(heap) right_freq, right_node = heappop(heap) combined_freq = left_freq + right_freq new_node = Node(None, combined_freq) new_node.left = left_node new_node.right = right_node heappush(heap, (combined_freq, new_node)) return heap[0][1] # 使用示例 freqs = {"A": 5, "B": 8, "C": 4} huff_tree = build_huffman_tree(freqs) huffman_codes = {char: get_code(node, '') for char, node in huff_tree.nodes.items()} def get_code(node, code): if node is None or node.char is not None: return node.char if node.char else '' return get_code(node.left, '0') + get_code(node.right, '1') # 对二进制编码进行解码 binary_code = "101110" # 示例二进制编码 decoded_string = decode(binary_code, huffman_codes) print("Decoded String:", decoded_string) # 相关问题-- 1. 如何在实际项目中应用哈夫曼树? 2. 哈夫曼树如何处理动态更新的频率信息? 3. 解码过程中如果遇到未知编码会怎样处理?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值