leetcode_c++:图:Course Schedule II (207)

原创 2016年08月28日 15:11:38

There are a total of n courses you have to take, labeled from 0 to n - 1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, return the ordering of courses you should take to finish all courses.

There may be multiple correct orders, you just need to return one of them. If it is impossible to finish all courses, return an empty array.

For example:

2, [[1,0]]

There are a total of 2 courses to take. To take course 1 you should have finished course 0. So the correct course order is [0,1]

4, [[1,0],[2,0],[3,1],[3,2]]

There are a total of 4 courses to take. To take course 3 you should have finished both courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0. So one correct course order is [0,1,2,3]. Another correct ordering is[0,2,1,3].


跟 207 一样拓扑排序,不过要记录路径。

用栈,只要每次记一下节点就行了。
用 dfs,不能跟 207 一样直接一个一个 check 过去。先找出入度为 0 的节点,再 dfs 过去。dfs 中每个节点处理完子节点后再把自己节点加到路径中,这样就维护了一个倒序的路径,最后把这个路径反向一下就行了。


#include <bits/stdc++.h>

using namespace std;
const int N = 0;

class Solution {
public:
    vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
        graph = vector<vector<int> >(numCourses);
        vis = vector<int>(numCourses);

        vector<int> inorder(numCourses);
        vector<int> path;
        // generate the tree map
        for (auto prerequisite : prerequisites) {
            graph[prerequisite.second].push_back(prerequisite.first);
            inorder[prerequisite.first] += 1;
        }
        // find out 0-in-order node and dfs
        for (int i = 0; i < numCourses; ++i) {
            if (inorder[i] == 0) {
                if (dfs(i, path) == false) // can not topsort
                    return vector<int>();
            }
        }
        if (path.size() != numCourses)
            return vector<int>();
        reverse(path.begin(), path.end());
        return path;
    }
private:
    vector<vector<int> > graph;
    vector<int> vis;

    bool dfs(int id, vector<int> &path) {
        vis[id] = 1; // visiting
        for (auto toid : graph[id]) {
            if (vis[toid] == 1)
                return false;
            if (vis[toid] == 2)
                continue;
            if (dfs(toid, path) == false)
                return false;
        }
        vis[id] = 2; // visited
        path.push_back(id);
        return true;
    }
};

int main() {
    Solution s;
    vector<pair<int, int>> prerequisites;
    prerequisites.push_back(pair<int, int>(0, 2));
    prerequisites.push_back(pair<int, int>(2, 0));
    prerequisites.push_back(pair<int, int>(1, 2));
    vector<int> res = s.findOrder(3, prerequisites);
    for (auto x : res) cout << x << ' ';
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

cocos2d-x schedule 定时器

1.取消一个定时器 所有的定时器都用下面的额这个方法取消 C++ //void unschedule(SEL_SCHEDULE selector); unschedule(s...
  • zhuzhihai1988
  • zhuzhihai1988
  • 2013年07月12日 11:13
  • 3884

算法练习(28):Course Schedule II

题意:给出有向图,找出它的拓扑排序 分析与思路:同样还是Course Schedule I(上一个博客)的思路,只不过在每次访问完一个结点的时候把它push起来,为什么呢?因为拓扑排序实际上就是结点...
  • KingsonYing
  • KingsonYing
  • 2017年12月08日 00:16
  • 32

图的深度广度搜索简单训练:Course Schedule

先看题目: There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may ...
  • Ray_sysu
  • Ray_sysu
  • 2017年03月20日 11:18
  • 127

算法练习(27):Course Schedule

题意:给出有向图,判断是否有环 分析与思路:题目看上去简单,但是没有一个套路还是挺难想的,求有向图是否有环,有一个思路清晰又实用的方法,就是用dfs遍历同时判断是否有回边,pre[node]和pos...
  • KingsonYing
  • KingsonYing
  • 2017年12月07日 23:30
  • 14

拓扑排序:课程表Course Schedule

There are a total of n courses you have to take, labeled from 0 to n - 1.Some courses may have prere...
  • gao1440156051
  • gao1440156051
  • 2016年05月31日 16:28
  • 686

spring中schedule注解的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 以前框架使用quartz框架执行定时调度问题、 老大说这配置太麻烦、每个调度都需要多加在spring的配置中、 能不能减...
  • yinbucheng
  • yinbucheng
  • 2017年02月15日 10:18
  • 800

ejb3中的@Schedule中的persistent属性的深入探索

标题:ejb3中的@Schedule中的persistent属性的深入探索 1 实验环境:     应用服务器:glassfish4.0     数据库服务器: MYSQL Target Ser...
  • WK313753744
  • WK313753744
  • 2015年06月09日 19:00
  • 2252

spring schedule定时任务(二):配置文件的方式

接着上一篇,这里使用spring配置文件的方式生成spring定时任务。 1、相应的web.xml没有什么变化,因此便不再罗列。同样的,相应的java代码业务逻辑改动也不大,只是在原来的基础...
  • tuzongxun
  • tuzongxun
  • 2016年06月03日 10:52
  • 5827

内核抢占和schedule()函数的分析

1.线程描述符:struct thread_info { struct task_struct *task; struct exec_domain *exec_doma...
  • liuxiaowu19911121
  • liuxiaowu19911121
  • 2015年07月22日 17:31
  • 987

spring定时任务如何运行 schedule解析

经过长时间的研究spirng的源码,发现如果仅仅只是在xml里配置定时任务或者通过注解来实现配置定时任务的话,无需依赖spring-context-support包,这个包里所含的scheduling...
  • abcde474524573
  • abcde474524573
  • 2016年08月25日 14:04
  • 2320
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetcode_c++:图:Course Schedule II (207)
举报原因:
原因补充:

(最多只允许输入30个字)