P11378 [GESP202412 七级] 燃烧
题目描述
小杨有一棵包含 nnn 个节点的树,其中节点的编号从 111 到 nnn。节点 iii 的权值为 aia_iai。
小杨可以选择一个初始节点引燃,每个燃烧的节点会将其相邻节点中权值严格小于自身权值的在节点间扩散直到不会有新的节点被引燃。
小杨想知道在合理选择初始节点的情况下,最多可以燃烧多少个节点。
输入格式
第一行包含一个正整数 nnn,表示节点数量。
第二行包含 nnn 个正整数 a1,a2,…,ana_1,a_2,\dots,a_na1,a2,…,an,代表节点权值。
之后 n−1n-1n−1 行,每行包含两个正整数 ui,viu_i,v_iui,vi,代表存在一条连接节点 uiu_iui 和 viv_ivi 的边。
输出格式
输出一个正整数,代表最多燃烧的节点个数。
输入输出样例 #1
输入 #1
5
6 2 3 4 5
1 2
2 3
2 5
1 4
输出 #1
3
说明/提示
| 子任务编号 | 数据点占比 | nnn |
|---|---|---|
| 111 | 20%20\%20% | ≤10\leq 10≤10 |
| 222 | 20%20\%20% | ≤100\leq 100≤100 |
| 333 | 60%60\%60% | ≤105\leq 10^5≤105 |
对于全部数据,保证有 1≤n≤1051\leq n\leq 10^51≤n≤105,1≤ai≤1061\leq a_i\leq 10^61≤ai≤106。
C++实现
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int n,a[1000006],vis[1000006];
vector<int> edge[1000006];
int dfs(int x){
if(vis[x] != 0) return vis[x];
int cnt = 0;
for(auto &v : edge[x])
if(a[x] > a[v]) //如果连接的点比自己的小
cnt += dfs(v); //先统计
return vis[x] = cnt + 1;
}
main(){
cin >> n;
for(int i = 1;i <= n; i++) cin >> a[i];
for(int i = 1,x,y;i < n; i++){
cin >> x >> y;
edge[x].push_back(y);
edge[y].push_back(x);
}
int ans = 0;
for(int i = 1;i <= n; i++)
ans = max(ans,dfs(i));
cout << ans;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 P11378 GESP202412 七级 燃烧&spm=1001.2101.3001.5002&articleId=151781190&d=1&t=3&u=e413f71f527c4729bd10fa1b52226aff)
1475

被折叠的 条评论
为什么被折叠?



