HomeBlogTopicsPublish
  • rss

  • contact

© 2025 MIT Licensed

Topics→Programming→Leetcode 207

Programming

Leetcode
Leetcode 207Leetcode Stock
C++
C++ ConstC++ ConstructC++ ContainerC++ IoC++ Param PassC++ Seq Container

Leetcode 207

February 8, 2017

by Frank

该题目利用 DFS 和 BFS 来判断某个图是否能进行拓扑排序

该题目利用 DFS 和 BFS 来判断某个图是否能进行拓扑排序

  1. BFS 的思路是先将给定的 pair 组转换成 vector<unordered_set>格式存放的图,然后计算每个节点的入度,先找到入度为 0 的节点,如果未找到直接返回 false ,找到之后将该点的入度标记为-1,然后将其指向的节点的入度减 1,循环 n 次,如果每次都能找到入度为 0 的节点,那么可以进行拓扑排序。
class Solution {
public:
    bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
        vector<unordered_set<int>> graph = make_graph(numCourses, prerequisites);
        vector<int> degrees = compute_indegree(graph);
        for (int i = 0; i < numCourses; i++) {
            int j = 0;
            for (; j < numCourses; j++)
                if (!degrees[j]) break;
            if (j == numCourses) return false;
            degrees[j] = -1;
            for (int neigh : graph[j])
                degrees[neigh]--;
        }
        return true;
    }
private:
    vector<unordered_set<int>> make_graph(int numCourses, vector<pair<int, int>>& prerequisites) {
        vector<unordered_set<int>> graph(numCourses);
        for (auto pre : prerequisites)
            graph[pre.second].insert(pre.first);
        return graph;
    }
    vector<int> compute_indegree(vector<unordered_set<int>>& graph) {
        vector<int> degrees(graph.size(), 0);
        for (auto neighbors : graph)
            for (int neigh : neighbors)
                degrees[neigh]++;
        return degrees;
    }
};
  1. DFS 的思路则是通过 DFS 判断图中是否有环,通过 onPath 作为标记数组,来标记是否当前路径已经访问过,利用 visited 来标记已经访问过的节点,利用 dfs_cycle()来判断当前的 dfs 路径上是否有环
class Solution {
public:
    bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
        vector<unordered_set<int>> graph = make_graph(numCourses, prerequisites);
        vector<bool> onpath(numCourses, false), visited(numCourses, false);
        for (int i = 0; i < numCourses; i++)
            if (!visited[i] && dfs_cycle(graph, i, onpath, visited))
                return false;
        return true;
    }
private:
    vector<unordered_set<int>> make_graph(int numCourses, vector<pair<int, int>>& prerequisites) {
        vector<unordered_set<int>> graph(numCourses);
        for (auto pre : prerequisites)
            graph[pre.second].insert(pre.first);
        return graph;
    }
    bool dfs_cycle(vector<unordered_set<int>>& graph, int node, vector<bool>& onpath, vector<bool>& visited) {
        if (visited[node]) return false;
        onpath[node] = visited[node] = true;
        for (int neigh : graph[node])
            if (onpath[neigh] || dfs_cycle(graph, neigh, onpath, visited))
                return true;
        return onpath[node] = false;
    }
};
Next: Leetcode Stock→

Comments