Pixiv - Miracle
2-牛客周赛 Round 138题解
555 字
3 分钟
2-牛客周赛 Round 138题解
链接:https://ac.nowcoder.com/acm/contest/131111/D 来源:牛客网
小苯有一棵 个节点的有根树,根为 。每个节点 有一个颜色 。
小苯定义一条路径 ( 是 的祖先)是“同色路径”,当且仅当路径上所有节点的颜色相同
注意:路径必须是祖先 后代关系,且方向必须从祖先到后代。
小苯想知道,树中一共有多少条不同的同色路径。
你的任务是求出同色路径的数量。
输入描述:
每个测试文件均包含多组测试数据。
第一行输入一个整数 ,代表数据组数,每组测试数据描述如下:
第一行包含一个整数 。
第二行包含 个整数 。
接下来 行,每行包含两个整数 ,表示树中有一条边 ,保证构成一棵以 为根的树。
除此之外,保证单个测试文件的 。
输出描述:
对于每组测试数据: 输出一个整数,表示同色路径的数量。
示例1
输入
251 1 2 1 21 22 32 44 561 2 2 3 3 11 22 33 44 55 6输出
32说明
对于第一组测试数据,合法路径有:,共 个。
对每个结点记录以该结点为结尾的最长路径长度,应为自顶向下的树形DP
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 1;
int c[N];
void solve() { int n;cin>>n; for (int i = 0; i < n; ++i) { cin >> c[i]; }
vector<vector<int>> g(n); vector<int> fa(n); vector<int> dp(n); for (int i = 1; i < n; ++i) { int u, v; cin >> u >> v;--u;--v; g[u].push_back(v); g[v].push_back(u); }
queue<int> q; q.push(0); dp[0] = 1; int ans = 0; while (q.size()) { int sz = q.size(); while (sz--) { int t = q.front(); q.pop();
for (auto& son : g[t]) { if (son != fa[t]) { fa[son] = t; if (c[son] == c[t]) { dp[son] = dp[t] + 1; ans += dp[t]; } else { dp[son] = 1; } q.push(son); } } } }
cout << ans << '\n';}
int main() { ios::sync_with_stdio(false);cin.tie(nullptr); int t; cin>>t; while (t--) { solve(); }}文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
2-牛客周赛 Round 138题解
https://skaco2.com/posts/03-solutions/2-牛客周赛-round-138题解/ 相关文章 智能推荐
1
3-牛客挑战赛 87题解
题解 算法
2
1-Codeforces Round 1091 (Div. 2) and CodeCraft 26题解
题解 算法
3
2-排序
算法 排序
4
4-P1494 [国家集训队] 小 Z 的袜子
题解 算法
5
12-数据结构-2
算法 数据结构
随机文章 随机推荐