https://leetcode-cn.com/problems/largest-color-value-in-a-directed-graph/submissions/
我自己的解法,记忆化搜索
rec[i]记录以i为起点的路径,所有颜色的最大值
class Solution {
public:
int n;
int idx = 0;
vector<int> head;
vector<bool> vis1;
vector<bool> vis2;
struct {
int nxt, to;
} es[100005];
vector<vector<int> > rec;
int cnt[26] = {0};
int ans = 0;
vector<int> dfs(int i, int s, string &color) {
if (vis1[i]) {
ans = -1;
return vector<int>(26, 0);
}
if (vis2[i]) {
return rec[i];
}
vis1[i] = true;
for (int e = head[i]; e != -1; e = es[e].nxt) {
vector<int> ret = dfs(es[e].to, s, color);
for (int k = 0; k < 26; ++k) {
rec[i][k] = max(rec[i][k], ret[k]);
}
}
++rec[i][color[i] - 'a'];
vis1[i] = false;
vis2[i] = true;
return rec[i];
}
int largestPathValue(string colors, vector<vector<int>>& edges) {
int n = colors.length();
head.resize(n, -1);
vis1.resize(n, false);
vis2.resize(n, false);
rec.resize(n, vector<int>(26, 0));
for (auto &e : edges) {
es[++idx].to = e[1];
es[idx].nxt = head[e[0]];
head[e[0]] = idx;
}
for (int i = 0; i < n; ++i) {
dfs(i, i, colors);
if (ans == -1) {
return -1;
}
for (int k = 0; k < 26; ++k) {
ans = max(rec[i][k], ans);
}
}
return ans;
}
};
拓扑排序加dp
class Solution {
public:
int largestPathValue(string colors, vector<vector<int>>& edges) {
int n = colors.size();
// 邻接表
vector<vector<int>> g(n);
// 节点的入度统计,用于找出拓扑排序中最开始的节点
vector<int> indeg(n);
for (auto&& edge: edges) {
++indeg[edge[1]];
g[edge[0]].push_back(edge[1]);
}
// 记录拓扑排序过程中遇到的节点个数
// 如果最终 found 的值不为 n,说明图中存在环
int found = 0;
vector<array<int, 26>> f(n);
queue<int> q;
for (int i = 0; i < n; ++i) {
if (!indeg[i]) {
q.push(i);
}
}
while (!q.empty()) {
++found;
int u = q.front();
q.pop();
// 将节点 u 对应的颜色增加 1
++f[u][colors[u] - 'a'];
// 枚举 u 的后继节点 v
for (int v: g[u]) {
--indeg[v];
// 将 f(v,c) 更新为其与 f(u,c) 的较大值
for (int c = 0; c < 26; ++c) {
f[v][c] = max(f[v][c], f[u][c]);
}
if (!indeg[v]) {
q.push(v);
}
}
}
if (found != n) {
return -1;
}
int ans = 0;
for (int i = 0; i < n; ++i) {
ans = max(ans, *max_element(f[i].begin(), f[i].end()));
}
return ans;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/largest-color-value-in-a-directed-graph/solution/you-xiang-tu-zhong-zui-da-yan-se-zhi-by-dmtaa/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


京公网安备 11010502036488号