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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。