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++; }};
- 【Course Schedule】Course Schedule
- Course Schedule
- Course Schedule
- Course Schedule
- Course Schedule
- Course Schedule
- Course Schedule
- Course Schedule
- Course Schedule
- Course Schedule
- Course Schedule
- Course Schedule
- Course Schedule
- Course Schedule
- Course Schedule
- Course Schedule
- Course Schedule
- Course Schedule
- Linux系统管理及系统安全命令
- 软件工程导论第三章作业3.4
- Scrapy输出CSV指定顺序的列表
- 二叉树相关的算法题
- Quick Sort(快速排序)
- Course Schedule
- 会话跟踪
- Java理解之线性安全与线性不安全
- 《 穷查理宝典》
- log4j
- 使用zxing生成二维码
- ShopStore项目总结(二)
- 熵编码之指数哥伦布编码
- 什么叫人生规划