forked from kamyu104/LeetCode-Solutions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlargest-color-value-in-a-directed-graph.cpp
39 lines (38 loc) · 1.2 KB
/
largest-color-value-in-a-directed-graph.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 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;
}
};