19032 树上上升序列

### 思路
1. **输入处理**:读取节点个数、点权和边。
2. **构建图**:将树转换为有向无环图(DAG),边的方向从点权小的指向点权大的。
3. **拓扑排序**:对DAG进行拓扑排序。
4. **动态规划**:使用动态规划求解最长路径。

### 细节
- **图的构建**:遍历所有边,根据点权大小确定边的方向。
- **拓扑排序**:使用Kahn算法或DFS进行拓扑排序。
- **动态规划**:初始化每个节点的最长路径长度为1,按照拓扑排序的顺序更新每个节点的最长路径长度。

### 伪代码
```plaintext
function longest_increasing_path(n, a, edges):
    graph = build_graph(n, a, edges)
    topo_order = topological_sort(graph)
    dp = array of size n initialized to 1

    for node in topo_order:
        for neighbor in graph[node]:
            if a[node] < a[neighbor]:
                dp[neighbor] = max(dp[neighbor], dp[node] + 1)

    return max(dp)

function build_graph(n, a, edges):
    graph = adjacency list of size n
    for u, v in edges:
        if a[u-1] < a[v-1]:
            graph[u-1].append(v-1)
        else:
            graph[v-1].append(u-1)
    return graph

function topological_sort(graph):
    in_degree = array of size n initialized to 0
    for node in graph:
        for neighbor in graph[node]:
            in_degree[neighbor] += 1

    queue = empty queue
    for i in range(n):
        if in_degree[i] == 0:
            queue.push(i)

    topo_order = empty list
    while queue is not empty:
        node = queue.pop()
        topo_order.append(node)
        for neighbor in graph[node]:
            in_degree[neighbor] -= 1
            if in_degree[neighbor] == 0:
                queue.push(neighbor)

    return topo_order
```

### C++代码

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>using namespace std;vector<vector<int>> build_graph(int n, const vector<int>& a, const vector<pair<int, int>>& edges) {vector<vector<int>> graph(n);for (const auto& edge : edges) {int u = edge.first - 1;int v = edge.second - 1;if (a[u] < a[v]) {graph[u].push_back(v);} else {graph[v].push_back(u);}}return graph;
}vector<int> topological_sort(const vector<vector<int>>& graph) {int n = graph.size();vector<int> in_degree(n, 0);for (const auto& neighbors : graph) {for (int neighbor : neighbors) {in_degree[neighbor]++;}}queue<int> q;for (int i = 0; i < n; ++i) {if (in_degree[i] == 0) {q.push(i);}}vector<int> topo_order;while (!q.empty()) {int node = q.front();q.pop();topo_order.push_back(node);for (int neighbor : graph[node]) {in_degree[neighbor]--;if (in_degree[neighbor] == 0) {q.push(neighbor);}}}return topo_order;
}int longest_increasing_path(int n, const vector<int>& a, const vector<pair<int, int>>& edges) {vector<vector<int>> graph = build_graph(n, a, edges);vector<int> topo_order = topological_sort(graph);vector<int> dp(n, 1);for (int node : topo_order) {for (int neighbor : graph[node]) {if (a[node] < a[neighbor]) {dp[neighbor] = max(dp[neighbor], dp[node] + 1);}}}return *max_element(dp.begin(), dp.end());
}int main() {int n;cin >> n;vector<int> a(n);for (int i = 0; i < n; ++i) {cin >> a[i];}vector<pair<int, int>> edges(n - 1);for (int i = 0; i < n - 1; ++i) {cin >> edges[i].first >> edges[i].second;}cout << longest_increasing_path(n, a, edges) << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/410153.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建一个Vue2项目

我们都知道&#xff0c;可以使用 pnpm create vuelatest 来创建一个最新版本的vue项目,该版本为Vue3,但是这个过程没有给我们选择创建的vue版本 经典创建Vue2项目流程 1.下载Vue脚手架 pnpm i vue/cli 2.执行vue指令创建Vue项目 这里因为我们不想选择全局位置安装全局依赖&…

小程序打开空白的问题处理

小程序打开是空白的&#xff0c;如下&#xff1a; 这个问题都是请求域名的问题&#xff1a; 一、检查服务器域名配置了 https没有&#xff0c;如果没有&#xff0c;解决办法是申请个ssl证书&#xff0c; 具体看这里 https://doc.crmeb.com/mer/mer2/4257 二、完成第一步后&a…

R 2火灾温度预测

火灾温度预测 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 使用LSTM进行时间序列预测 这周学习如何使用长短期记忆网络&#xff08;LSTM&#xff09;进行时间序列预测。使用PyTorch框架来构建和训练模型&…

捷途山海T2:混动技术,省钱驾驶新体验

在今日的汽车市场中&#xff0c;消费者的选择已经远远超出了传统的燃油车的范畴。随着节能、环保及用车成本等问题的逐渐凸显&#xff0c;人们开始寻找更加高效且环保的出行方式。在这一背景下&#xff0c;捷途山海T2作为一款搭载了高效混动系统的汽车&#xff0c;以其出色的节…

《机器学习》 贝叶斯分类器 原理、参数讲解及代码演示

目录 一、贝叶斯算法 1、简介 2、贝叶斯算法具有以下特点&#xff1a; 二、贝叶斯原理 1、正向概率&#xff08;先验概率&#xff09; 例如&#xff1a; 2、逆向概率&#xff08;后验概率&#xff09; 3、公式 1&#xff09;实例1 2&#xff09;实例2 • 目标&#x…

轻松获得ADSL代理服务

ADSL 代理服务接入常见问答 在当今激烈的网络爬虫与反爬虫斗争中&#xff0c;各大网站和应用程序采取的风险管理手段愈加严格&#xff0c;其中最常见的一种措施是 IP 封禁。 为了有效应对 IP 封禁带来的挑战&#xff0c;设置代理服务成为一种非常有效的解决方案。配置完代理后…

【计算机网络】电路交换、报文交换、分组交换

电路交换&#xff08;Circuit Switching&#xff09;&#xff1a;通过物理线路的连接&#xff0c;动态地分配传输线路资源 ​​​​

【2024】10个好用的AI搜索引擎大盘点

在2024年&#xff0c;随着人工智能技术的飞速发展&#xff0c;AI搜索引擎已经成为我们日常生活中不可或缺的一部分。这些基于人工智能技术的搜索引擎不仅提供了更快速、更准确的搜索体验&#xff0c;还通过自然语言处理&#xff08;NLP&#xff09;和机器学习&#xff08;ML&am…

快速学习“堆“排序(C语言数据结构)

前言&#xff1a; 堆的实现其实并不难&#xff0c;难的是要用堆实现排序&#xff0c;也就是堆的运用。 下面需要探究一下堆的排序是怎样的。 如何利用堆进行升序或者降序的排序。 "堆排序"&#xff1a; 原理&#xff1a; 例如&#xff1a;此时要将数组里的数组int a…

Leetcode面试经典150题-5.最长回文子串

解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public static String longestPalindrome(String s) {if(s null || s.length() 0) {return null;}//加工字符串&#xff0c;例如abcdcba加工成#a#b#c#d#a#b#c#d#String str getManacherString(s);char[] str…

【生日视频制作】滑行飞机机身改字,轻松修改文字AE模板修改文字软件生成器教程特效素材【AE模板】

飞机机身生日视频制作教程AE模板改文字特效广告生成器素材玩法 怎么如何做的【生日视频制作】滑行飞机机身改字&#xff0c;轻松修改文字AE模板修改文字软件生成器教程特效素材玩法【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件下载AE模板把AE模板导入AE软件修改图片或…

基于Java+SpringBoot+Vue的知识管理系统

基于JavaSpringBootVue的知识管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 哈喽…

利用“2+1链动模式小程序AI智能名片S2B2C商城源码”优化企业参与外部社群策略

摘要&#xff1a;在当今数字化时代&#xff0c;企业参与外部社群已成为其市场扩张、品牌塑造及用户增长不可或缺的一环。然而&#xff0c;面对浩如烟海的社群类型&#xff0c;包括行业论坛、地区性论坛、特定兴趣爱好的论坛以及短视频网站等&#xff0c;如何精准选择并有效介入…

计算机网络-PIM-SM组播实验

一、概述 目前为止我们学习了组播转发网络中的PIM协议&#xff0c;PIM模型有两种&#xff1a; PIM-DM主要使用在网络规模较小&#xff0c;用户集中的组播网络中。 PIM-SM主要使用在网络规模较大&#xff0c;用户较为分散的组播网络中。PIM-SM基于组播模型又可以分为PIM-SM&…

重装系统前如何备份数据?让重装无后顾之忧

在日常使用电脑的过程中&#xff0c;有时我们可能需要重装系统以解决一些难以通过常规手段解决的问题。然而&#xff0c;在重装系统之前&#xff0c;最重要的一步就是备份数据&#xff0c;以防止重要信息的丢失。本文将详细介绍如何在重装系统前进行数据备份&#xff0c;确保您…

周报(8.12-8.18)

周报(8.12-8.18) 本周工作 DD-Net学习与代码复现 DD-Net网络结构如上图所示。DD-Net也有一个为处理OpenFWI数据的版本&#xff1a;DD-Net70&#xff1a; 与传统DL-FWI不同的是&#xff0c;DD-Net同时拥有两个解码器&#xff0c;第一个解码器的目标是传统的速度模型&#xff0…

力扣第71题:简化路径 放弃栈模拟,选择数据流√(C++)

目录 题目 思路 解题过程 复杂度 Code 题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff…

医生隐瞒病情属于什么行为?

根据《民法典》第一千二百二十二条的规定&#xff0c;患者在诊疗活动中受到损害&#xff0c;有下列情形之一的&#xff0c;推定医疗机构有过错&#xff1a;   &#xff08;一&#xff09;违反法律、行政法规、规章以及其他有关诊疗规范的规定&#xff1b;   &#xff08;二…

LLMs 基础知识 | BERT 模型族

本文主要文章是解决蚂蚁金服携手上海财经大学&#xff0c;共同出具大预言模型白皮书一文中的部分模型问题。 01 Slef-Attention 注意力机制&#xff0c;注意力权重可以看作是输入对输出的重要程度。这里注意&#xff0c;所谓注意力&#xff0c;即模型认为该单词有多值得被注意…

基于BlockQueue的生产消费模型及Linux中的信号量

基于BlockQueue的生产消费模型 Task.hpp #pragma once#include<cstdio> #include<iostream> #include<string> #include<functional>using namespace std; class CalTask {using func_tfunction<int(int,int,char)>;//typedef function<int(…