Course Schedule

来源:互联网 发布:华语网络女歌手排行榜 编辑:程序博客网 时间:2024/06/10 03:13

There are a total of n courses you have to take, labeled from 0 ton - 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, is it possible for you to finish all courses?

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 it is possible.

2, [[1,0],[0,1]]

There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.

Note:

1.The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more abouthow a graph is represented.

2.You may assume that there are no duplicate edges in the input prerequisites. 


题目的意思转化为所有课程是否存在拓扑排序.一张图存在拓扑排序的充要条件就是不存在回边.对一条边(u,v),判断其是否是回边的方法就是比较pre值和pos值.如果pre[v] < pre[u] <pos[u] < pos[v],那么该边就是回边.对图进行深度优先搜索,得到所有点的pre值和pos值,比较每一条边的两个点的pre值和pos值,如果是回边,就不满足拓扑排序.

#include <iostream>#include <queue>using namespace std;class Solution {public:int clock=0;int *pre,*pos;bool* visited;    bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {    pre =new int[numCourses];    pos = new int [numCourses];    visited=new bool[numCourses];    for (int i=0; i < numCourses; ++i) visited[i]=false;        for (int i = 0; i < prerequisites.size(); ++i) {        if (!visited[prerequisites[i].first])        explore(prerequisites, prerequisites[i].first);        if (!visited[prerequisites[i].second])        explore(prerequisites, prerequisites[i].second);        }        for (int i = 0; i < prerequisites.size(); ++i) {        int u = prerequisites[i].second,v=prerequisites[i].first;        if (pre[v] < pre[u] &&pos[u] < pos[v])        return false;        }        delete pre;        delete pos;        delete visited;        clock=0;        return true;    }    void explore(vector<pair<int, int>>& prerequisites, int u) {    visited[u]=true;    pre[u]=clock++;    for (int i = 0; i < prerequisites.size(); ++i) {    if (prerequisites[i].second==u) {    int v = prerequisites[i].first;    if (!visited[v])    explore(prerequisites,v);    }    }    pos[u]=clock++;    }};


原创粉丝点击