Hard
Largest Color Value in a Directed Graph — C++
Full explanation · Time O(n + m) · Space O(n + m)
// Time: O(n + m)
// Space: O(n + m)
class Solution {
public:
int largestPathValue(string colors, vector<vector<int>>& edges) {
vector<vector<int>> adj(size(colors));
vector<int> in_degree(size(colors));
for (const auto& edge : edges) {
adj[edge[0]].emplace_back(edge[1]);
++in_degree[edge[1]];
}
vector<int> q;
for (int i = 0; i < size(colors); ++i) {
if (!in_degree[i]) {
q.emplace_back(i);
}
}
vector<vector<int>> dp(size(colors), vector<int>(26));
int result = -1, cnt = 0;
while (!empty(q)) {
vector<int> new_q;
for (const auto& u : q) {
++cnt;
result = max(result, ++dp[u][colors[u] - 'a']);
for (const auto& v : adj[u]) {
for (int c = 0; c < 26; ++c) {
dp[v][c] = max(dp[v][c], dp[u][c]);
}
if (!--in_degree[v]) {
new_q.emplace_back(v);
}
}
}
q = move(new_q);
}
return cnt == size(colors) ? result : -1;
}
};