LeetCode 207. Course Schedule
领扣 207. 课程表
共有n门课程编号0
到n-1
,prerequisites[i]
表示课程的先后关系,是一个二元组,prerequisites[i].second -> prerequisites[i].first
,表示先上课程prerequisites[i].second
,然后才能上课程prerequisites[i].first
判断所有课程是否冲突(即判断有向图中是否存在环)
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
int indegree[numCourses + 10]; // 存放每个节点的入度
memset( indegree, 0, sizeof( indegree ) );
vector<int> G[numCourses + 10]; // 邻接表
// 边的定义:prerequisites[i].second -> prerequisites[i].first
for( int i = 0; i < prerequisites.size(); i++ )
{
// 构造graph
G[ prerequisites[i].second ].push_back( prerequisites[i].first );
// 统计入度
indegree[ prerequisites[i].first ]++;
}
queue<int> q;
// 将入度为0的点入队(如果有的话)
for( int i = 0; i < numCourses; i++ )
if( indegree[i] == 0 )
q.push(i);
int ccount = 0;
while( !q.empty() )
{
int cur = q.front();
q.pop();
ccount++;
// 输出cur节点后,修改所有与cur相邻的节点的入度
for( int i = 0; i < G[cur].size(); i++ )
{
indegree[ G[cur][i] ]--;
// 将入度为0的点入队
if( indegree[ G[cur][i] ] == 0 )
q.push( G[cur][i] );
}
}
return ccount == numCourses;
}
};
【相关练习】
LeetCode 210. Course Schedule II
领扣 210. 课程表 II
输出一种拓扑排序结果,如果有向图中存在环,返回[]
class Solution {
public:
vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
int indegree[numCourses + 10]; // 存放每个节点的入度
memset( indegree, 0, sizeof( indegree ) );
vector<int> G[numCourses + 10]; // 邻接表
// 边的定义:prerequisites[i].second -> prerequisites[i].first
for( int i = 0; i < prerequisites.size(); i++ )
{
// 构造graph
G[ prerequisites[i].second ].push_back( prerequisites[i].first );
// 统计入度
indegree[ prerequisites[i].first ]++;
}
queue<int> q;
// 将入度为0的点入队(如果有的话)
for( int i = 0; i < numCourses; i++ )
if( indegree[i] == 0 )
q.push(i);
vector<int> result;
while( !q.empty() )
{
int cur = q.front();
q.pop();
result.push_back( cur );
// 输出cur节点后,修改所有与cur相邻的节点的入度
for( int i = 0; i < G[cur].size(); i++ )
{
indegree[ G[cur][i] ]--;
// 将入度为0的点入队
if( indegree[ G[cur][i] ] == 0 )
q.push( G[cur][i] );
}
}
return result.size() == numCourses ? result : vector<int>();
}
};