全部评论
#include <bits> using namespace std; struct Node { int r, g, b; Node() { r = g = b = 0; } }; unordered_map<long long="">mp; string s; vector<vector><int>>G; Node a; Node dfs(int start, int except_) { long long mps = (long long)start * 100000 + except_; if(mp.count(mps)) return mp[mps]; Node ans; if(s[start] == 'r') ans.r++; else if(s[start] == 'g')ans.g++; else ans.b++; for(auto &i : G[start]) { if(i == except_) continue; auto res = dfs(i, start); ans.r += res.r; ans.g += res.g; ans.b += res.b; } mp[mps] = ans; auto temp = ans; temp.r = a.r - ans.r; temp.g = a.g - ans.g; temp.b = a.b - ans.b; mp[(long long)except_ * 100000 + start] = temp; return ans; } int main() { int n; cin >> n; cin >> s; G = vector<vector><int>>(n); for(int i = 0, u, v; i < n - 1; i++) { cin >> u >> v; G[u - 1].push_back(v - 1); G[v - 1].push_back(u - 1); } for(int i = 0; i < n; i++) { if(s[i] == 'r') a.r++; else if(s[i] == 'g') a.g++; else a.b++; } int ans = 0; unordered_map<long long="">vis; for(int i = 0; i < n; i++) { for(auto &j : G[i]) { if(vis.count((long long)i * 100000 + j)) continue; auto res = dfs(j, i); if(res.r > 0 && res.g > 0 && res.b > 0) { res.r = a.r - res.r; res.g = a.g - res.g; res.b = a.b - res.b; if(res.r > 0 && res.g > 0 && res.b > 0) ans++; } vis[(long long)i * 100000 + j] = vis[(long long)j * 100000 + i] = true; } } cout << ans << endl; return 0; }</long></int></vector></int></vector></long></bits>
3色树找个连接数为1的作为根递归就行 返回值就是自身+往下搜的颜色数 拿到返回值和总颜色数减下看可不可以断开
哥们a了多少
牛啊大佬,你有没有投过荣耀。这几天第一批秋招马上要截止了,我可以内推。荣耀honor招聘官网https://www.hihonor.com/cn/career/ 内推码:yuhvad
三色树dfs只过了25,真不知道哪里错了
第二题用js为什么通过率一直是0···明明测试用例是对的,真是要被这个输入输出搞吐血
相关推荐