Leetcod graph(new topic)

797. All Paths From Source to Target

cpp 复制代码
class Solution {
private:
    vector<vector<int>> res;
    void traversal(vector<vector<int>>& graph, vector<int>& path, int s){
        path.push_back(s);
        int n=graph.size();
        if(s == n-1){
            res.push_back(path);
        }
        for(auto v:graph[s]){
            traversal(graph, path, v);
        }
        path.pop_back();
    }
public:
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        vector<int> path;
        traversal(graph, path, 0);
        return res;
   

类似于多叉树

这里的s是记录正在走的节点

如果不是acyclic(无环), 要用另外一个vector 记录走过的节点,防止进入死循环

277. Find the Celebrity

cpp 复制代码
class Solution {
public:
    int findCelebrity(int n) {
        int cand = 0;
        for(int other = 1; other < n; other++){
            if(knows(cand, other) || !knows(other, cand)){
                cand = other;
            }
        }

        for(int other = 0; other<n; other++){
            if(cand == other) continue;
            if(knows(cand, other) || !knows(other, cand)) return -1;
        }
        return cand;
    }
};

1.首先要排除,因为条件,所以至多有一个名人,那么两两对比,选出唯一的可能是名人的那个人

2.对比的结果有四种

3.最后剩下的那一个也不一定是名人,要在判断

207. Course Schedule

1.DFS

cpp 复制代码
class Solution {
private:
    bool hasCycle = false;
    vector<bool> onPath;
    vector<bool> visited;
    vector<vector<int>> buildGraph(int numCourses, vector<vector<int>>& prerequisites){
        vector<vector<int>> graph(numCourses);
        for(auto prerequisite:prerequisites){
            int from = prerequisite[1];
            int to = prerequisite[0];
            graph[from].push_back(to);
        }
        return graph;
    }
    void traversal(vector<vector<int>>& graph, int s){
        if(onPath[s]){
            hasCycle = true;
        }
        if(visited[s] || hasCycle){
            return;
        }
        visited[s] = true;
        onPath[s] = true;
        for(auto t:graph[s]){
            traversal(graph, t);
        }
        onPath[s] = false;
    }
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        vector<vector<int>> graph = buildGraph(numCourses, prerequisites);
        visited = vector<bool>(numCourses);
        onPath = vector<bool>(numCourses);
        for(int i=0; i<numCourses; i++){
            traversal(graph, i);
        }
        return !hasCycle;
    }
};

1.首先要建一个graph表

2.遍历判断是否有环

210. Course Schedule II

cpp 复制代码
class Solution {
private:
    vector<int> res;
    bool hasCycle;
    vector<bool> visited, onPath;

    void traversal(vector<vector<int>>& graph, int s){
        if(onPath[s]){
            hasCycle = true;
        }
        if(visited[s] || hasCycle) return;
        onPath[s] = true;
        visited[s] = true;

        for(int t:graph[s]){
            traversal(graph, t);
        }
        res.push_back(s);
        onPath[s] = false;
    }

    vector<vector<int>> buildGraph(int numCourses, vector<vector<int>>& prerequisites){
        vector<vector<int>> graph(numCourses);
        for(auto prerequisite:prerequisites){
            int from = prerequisite[1];
            int to = prerequisite[0];
            graph[from].push_back(to);
        }
        return graph;
    }
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        vector<vector<int>> graph = buildGraph(numCourses, prerequisites);
        visited = vector<bool>(numCourses, false);
        onPath = vector<bool>(numCourses, false);
        for(int i=0; i<numCourses; i++){
            traversal(graph, i);
        }
        if(hasCycle) return {};
        reverse(res.begin(), res.end());
        return res;
    }
};

需要一个单独的vector记录

这里用的是后序,所以之后要reverse一下

相关推荐
GeekZHR17 分钟前
C语言指针2:数组名、二级指针、指针数组,一次把“指针和数组“讲透
c语言·数据结构·算法·指针
h_a_o777oah20 分钟前
【算法基础】卡特兰数:递推定义与折线对称公式推导及解题策略
c++·算法·acm·组合数学·卡特兰数·反射原理·动态规划dp
JAI科研28 分钟前
Deepseek Agent Harness教程(二) | DeepSeek Harness 设计思路
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·vllm
还不秃顶的计科生34 分钟前
具身智能论文学习10:π0: A Vision-Language-Action Flow Model for General Robot Control
人工智能·深度学习·算法·机器学习·语言模型·vla·vlm
happyprince41 分钟前
02-具体观 — Cordis 算法与实现剖析
算法
烬羽1 小时前
求第 K 大,为什么反而要用最小堆?
javascript·数据结构·算法
没落之王1 小时前
易学使者郑氏正脉郑冰推演马航事件
大数据·人工智能·算法·机器学习·可用性测试
阿部多瑞 ABU2 小时前
告别手工核图:基于 .NET + MuPDFCore 的 CAD 等轴测 PDF 材料表提取与新旧版本对比实战
后端·算法·ui·pdf·c#
郝学胜-神的一滴2 小时前
并查集深度入门:从玄学抽象到 QuickFind & QuickUnion 源码实战
数据结构·c++·python·程序人生·算法·软件开发
比奇堡裤头村2 小时前
统计学习方法——决策树
算法·决策树·学习方法