美文网首页
LC210 dfs复习

LC210 dfs复习

作者: 锦绣拾年 | 来源:发表于2020-05-31 20:56 被阅读0次

拓扑排序
主要思路:dfs,结束时间顺序,倒排。
难点:结束时间暂时不会用非递归的形式实现,本科时实现过一次,但是用了多个栈。
这个算法应该有更简单的方法

现在你总共有 n 门课需要选,记为 0 到 n-1。

在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]

给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。

可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。

示例 1:

输入: 2, [[1,0]] 
输出: [0,1]
解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 。
示例 2:

输入: 4, [[1,0],[2,0],[3,1],[3,2]]
输出: [0,1,2,3] or [0,2,1,3]
解释: 总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
     因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。
说明:

输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。
你可以假定输入的先决条件中没有重复的边。
提示:

这个问题相当于查找一个循环是否存在于有向图中。如果存在循环,则不存在拓扑排序,因此不可能选取所有课程进行学习。
通过 DFS 进行拓扑排序 - 一个关于Coursera的精彩视频教程(21分钟),介绍拓扑排序的基本概念。
拓扑排序也可以通过 BFS 完成。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/course-schedule-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

递归的方式

class Solution {
public:
    //map排序 bfs,dfs 
    static bool cmpex(pair<int,int> x1,pair<int,int> x2 ){
        return x1.second>x2.second;
    }

    int time=0;
    
    bool dfs(vector< vector<int> >&graph,int node,int color[],vector<pair<int,int>>&times){
        time+=1;
        color[node]=1;
        for(int i=0;i<graph.size();i++){
            if(color[i]==1&&i!=node&&graph[node][i]==1)
                return false;
            if(color[i]==0&&graph[node][i]==1){
                if(!dfs(graph,i,color,times))
                    return false;
            }
            time+=1;            
        }
        color[node]=2;
        // cout<<node<<endl;
        times.push_back(make_pair(node,time++));
        return true;
    }
    
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        //有向树 dfs bfs/dfs
        //如果不行 一定有圈
        //边数=节点数-1
        //无环,当且仅当dfs无后向边
        //拓扑排序
        vector< vector<int> > graph(numCourses,vector<int>(numCourses,0));
        for(int i=0;i<prerequisites.size();i++){
            graph[prerequisites[i][1]][prerequisites[i][0]]=1;
        }
        vector<int> res;
        //怎么dfs调用graph 怎么递归
        int color[numCourses];
        memset(color,0,sizeof(color));
        vector<pair<int,int>> timen;
        for(int i=0;i<numCourses;i++){
            // cout<<color[i]<<endl;
            if(color[i]==0){
                // dfs(graph,i,color,timen);
                    if(!dfs(graph,i,color,timen)){
                        vector<int> res;
                        return res;
                    }
            }
                           
        }
        sort(timen.begin(),timen.end(),cmpex);
        for(auto x:timen){
            res.push_back(x.first);
        }
        
        return res;
        
        

    }
};

相关文章

  • LC210 dfs复习

    拓扑排序主要思路:dfs,结束时间顺序,倒排。难点:结束时间暂时不会用非递归的形式实现,本科时实现过一次,但是用了...

  • 11.1

    复习了简单搜索,BFS 和 DFS,有些生疏了[POJ - 3278 ] (https://vjudge.net...

  • 各种DFS

    DFS邻接矩阵遍历图 DFS邻接表遍历图 DFS回溯(不走重复路径) DFS背包(可重复选) DFS背包(不可重复选)

  • 北航算法复习笔记

    #算法复习笔记 一 决策和策略 二 回溯法使用深度优先(dfs)搜索状态空间树 三 快速排序 标准(常用)快速排序...

  • HDFS shell操作

    创建目录hdfs dfs -mkdir 查看所有目录hdfs dfs -ls / 上传文件hdfs dfs -pu...

  • Binary Tree(2)

    BFS vs DFS for Binary Tree What are BFS and DFS for Binar...

  • Clone Graph (Leetcode 133)

    DFS Approach: 注意,对于DFS,对map的赋值要在DFS loop开始以前。这样可以避免由于grap...

  • hdfs的命令行使用

    语法:hdfs dfs 参数 hdfs dfs -ls / 查看根路径下面的文件或文件夹 hdfs dfs -mk...

  • DFS与N皇后问题

    DFS与N皇后问题 DFS 什么是DFS DFS是指深度优先遍历也叫深度优先搜索。 它是一种用来遍历或搜索树和图数...

  • DFS及其应用

    内容概要: DFS类的实现 DFS求解连通分量 DFS求解点对之间的一个路径 DFS判定无环图和二分图 相关概念 ...

网友评论

      本文标题:LC210 dfs复习

      本文链接:https://www.haomeiwen.com/subject/iigrzhtx.html