Leetcode210。为什么我的代码在特定情况下是错误的?

时间:2017-09-05 07:41:03

标签: c++

这是问题(https://leetcode.com/problems/course-schedule-ii/description/)。 我的解决方案来自“算法简介”。 使用DFS算法。并用白色,灰色和黑色为节点着色。

  1. 将所有节点标记为白色。
  2. 发现节点时,标记为灰色。
  3. 节点完成后,标记为黑色。
  4. 当边缘向后时,这意味着具有灰色的相邻节点。它有一个圆圈,它应该为空。
  5. 但我通过了大部分案件。但其中一些不是。 任何人都可以帮助我吗?

    守则:

    class Solution {
    public:
        enum {WHITE, GRAY, BLACK};
    
        vector<vector<int>> graph;
        vector<int> colors;
        list<int> topo;
    
        void add_edge(vector<vector<int>>& graph, pair<int, int>& p) {
            graph[p.second].push_back(p.first);
        }
        bool visit(vector<vector<int>>& graph, int i) {
            if (colors[i] == WHITE) {
                colors[i] = GRAY;
                bool ret = true;
    
                for (int j = 0; j < graph[i].size(); j++) {
                    if (colors[graph[i][j]] == WHITE)
                        ret = ret && visit(graph, graph[i][j]);
                    else if (colors[graph[i][j]] == GRAY)
                        ret =  false;
                    else
                        ret =  false;
    
                }
    
                colors[i] = BLACK;
                topo.push_front(i);
                return ret;
            }
    
            return true;
        }
    
        bool dfs(vector<vector<int>>& graph) {
            for (int i = 0; i < graph.size(); i++)
                if (!visit(graph, i))
                    return false;
            return true;
        }
    
    
    
    public:
        vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
            graph.resize(numCourses, {});
            colors.resize(numCourses, WHITE);
    
            for (auto& pre: prerequisites)
                add_edge(graph, pre);
    
            if (!dfs(graph))
                return {};
    
            vector<int> ret (topo.begin(),topo.end());
            return ret;
        }
    };
    

1 个答案:

答案 0 :(得分:1)

        for (int j = 0; j < graph[i].size(); j++) {
            if (colors[graph[i][j]] == WHITE)
                ret = ret && visit(graph, graph[i][j]);
            else if (colors[graph[i][j]] == GRAY)
                ret =  false;
            else
                ret =  false;
        }

最后一个是节点是BLACK,这意味着它已经处理并推送到结果中。因此它不会使图形无效。只需删除最后一个,它将工作。像这样:

        for (int j = 0; j < graph[i].size(); j++) {
            if (colors[graph[i][j]] == WHITE)
                ret = ret && visit(graph, graph[i][j]);
            else if (colors[graph[i][j]] == GRAY)
                ret =  false;
            /* else
                ret =  false; */
        }