LC-210 课程规划2

主要问题:

输入课程数量,以及课程的前序条件(以[1, 0]形式,代表上课程1之前需要先上课程0),输出按什么顺序才能上完所有课,不能则输出空数组。

 

思路:

考虑到题目输入课程的前序条件的形式,可以看成每一门课是图论里的节点,而谦虚条件则是点到点之间的边。所以这里我们用拓扑排序,就能输出一个合法的序列。拓扑排序通常用来“排序”具有依赖关系的任务。

拓扑排序:

1. 找出入度为0的节点

2. 在图中除去该点,以及它的所有边

3. 重复1,2直到图中无节点。

 

代码:

 1 class Solution {
 2 public:
 3     vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
 4         int *vector_in_degree = new int[numCourses]();
 5         for (int i = 0; i < prerequisites.size(); i++) {
 6             vector_in_degree[prerequisites[i].first]++;
 7         }
 8         vector<int> answer;
 9         for (int i = 0; i < numCourses; i++) {
10             for (int j = 0; j < numCourses; j++) {
11                 if (vector_in_degree[j] == 0) {
12                     answer.push_back(j);
13                     vector_in_degree[j] = -1;
14                     for (int k = 0; k < prerequisites.size(); k++) {
15                         if (prerequisites[k].second == j)
16                             vector_in_degree[prerequisites[k].first]--;
17                     }
18                     break;
19                 }
20             }
21             if (answer.size() != i + 1) {
22                 answer.clear();
23                 return answer;
24             }
25         }
26         delete [] vector_in_degree;
27         return answer;
28     }
29 };

 

posted @ 2019-03-06 13:07  leo_lee  阅读(151)  评论(0编辑  收藏  举报