您的位置:首页 > 其它

[leetcode] 207. Course Schedule 解题报告

2016-02-26 14:10 253 查看
题目链接:https://leetcode.com/problems/course-schedule/

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, 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:

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

click to show more hints.

Hints:

This problem is equivalent to finding if a cycle exists in a directed graph. If a cycle exists, no topological ordering exists and therefore it will be impossible to take all courses.
Topological Sort via DFS - A great video tutorial (21 minutes) on Coursera explaining
the basic concepts of Topological Sort.
Topological sort could also be done via BFS.

思路:拓扑排序的应用.拓扑顺序就像是在一个工程中每个小项目完成有向后顺序一样,而我们的任务就是找出这个完成的先后顺利的序列.

其方法就是每次将一个入度为0的结点删除,并且将其指向的结点入度减一.

代码如下:

class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<unordered_set<int>> graph(numCourses, unordered_set<int>());//
vector<int> inDegree(numCourses, 0);//维护一个当前课程有多少先修课的数组
for(auto val:prerequisites)
{
if(graph[val.second].count(val.first) == 0)//如果当前先修课还没有被计算
{
graph[val.second].insert(val.first);//则将此课加入到先修课结点维护的集合中,代表此先修课完成之后才可以学的课
inDegree[val.first]++;//此课程的入度+1,代表有多少先修课
}
}
int i, j;
for(i = 0; i< numCourses; i++)
{
for(j = 0; j < numCourses; j++)//寻找入度为0的结点,找到就break循环
if(inDegree[j] == 0) break;
if(j == numCourses) return false;//如果最终没有找到,说明有环
inDegree[j]--;//将这个入度为0的结点删去
for(auto val: graph[j]) //将入度为0的结点指向的结点入度都-1
inDegree[val]--;
}
return true;
}
};


参考:忘记了,sorry!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: