From 6822f7dd8de367f8e4390852ce2e009a73c12e1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Thu, 22 Feb 2024 15:32:50 +0800 Subject: [PATCH] 'commit' --- .../LanQiaoBei/LanQiao15STEMA20231217/11.cpp | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 TangDou/LanQiaoBei/LanQiao15STEMA20231217/11.cpp diff --git a/TangDou/LanQiaoBei/LanQiao15STEMA20231217/11.cpp b/TangDou/LanQiaoBei/LanQiao15STEMA20231217/11.cpp new file mode 100644 index 0000000..58f1904 --- /dev/null +++ b/TangDou/LanQiaoBei/LanQiao15STEMA20231217/11.cpp @@ -0,0 +1,57 @@ +#include +using namespace std; +const int N = 100010; +vector g[N], f[N]; // 邻接表,一个正图,一个反图 +int c[N]; // 每个树洞中松鼠的数量 +/* +测试用例 +4 +5 +3 +6 +1 +1 2 +1 3 +2 4 +2 +*/ +int dfs1(int u, int k) { + if (k == 0) return 0; + int sum = c[u]; + for (int i = 0; i < g[u].size(); i++) sum += dfs1(g[u][i], k - 1); + return sum; +} +int dfs2(int u, int k) { + if (k == 0) return 0; + int sum = c[u]; + for (int i = 0; i < f[u].size(); i++) sum += dfs2(f[u][i], k - 1); + return sum; +} +int main() { + int n; // 树洞的数量 + cin >> n; + + for (int i = 1; i <= n; i++) cin >> c[i]; // 每个树洞中松鼠的数量 + + for (int i = 1; i < n; i++) { + int a, b; // 表示两个树洞相连接 + cin >> a >> b; + g[a].push_back(b); // 用邻接表保存一下某个树洞与哪两个其它树洞相连接 + f[b].push_back(a); // 建反图 + } + + int k; + cin >> k; + + for (int i = 1; i <= n; i++) { + // 计算i号树洞与它在k个距离内的所有树洞的松鼠个数和 + // 1、向下k个距离 k<=20 + int sum = dfs1(i, k); + // 2、向上k个距离 k<=20 + sum += dfs2(i, k); + + cout << sum - c[i] << endl; + } + + return 0; +} \ No newline at end of file