问题描述 :
你必须选修 numCourse 门课程,记为 0 到 numCourse-1 。
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]
给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?
示例 1:
输入: 2, [[1,0]]
输出: true
解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。
示例 2:
输入: 2, [[1,0],[0,1]]
输出: false
解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。
可使用以下main函数:
int main(){
vector<vector<int>> prerequisites;
int numCourses,m;
cin>>numCourses>>m;
int c1,c2;
int ch;
for(int i=0; i<m; i++){
vector<int> aPrerequisite;
cin>>c1>>c2;
aPrerequisite.push_back(c1);
aPrerequisite.push_back(c2);
prerequisites.push_back(aPrerequisite);
}
bool res=canFinish(numCourses,prerequisites);
cout<<(res?"true":"false")<<endl;
return 0;
}
提示:
输入的先决条件是由边组成,每条边包含两个元素,比如[1,0],表示学习课程 1 之前,需要先完成课程 0
你可以假定输入的先决条件中没有重复的边。
输入说明 :
首先输入numCourses和先决条件的数目m
然后输入m行,每行两个整数,表示先决条件中的两门课程编号。
1 <= numCourses <= 2000
输出说明 :
输出true或false
输入范例 :
2 2
1 0
0 1
输出范例 :
false
bool canFinish(int numCourses, vector<vector<int>>& prerequisites){
vector<vector<int>> edges(numCourses);
vector<int> indge(numCourses,0);
for(int i=0;i<prerequisites.size();i++){
edges[prerequisites[i][1]].push_back(prerequisites[i][0]);//建立图的邻接表
indge[prerequisites[i][0]]++;//入度++
}
queue<int> q;
for(int i=0;i<numCourses;i++){
if(indge[i]==0){//入度为零的全部入队
q.push(i);
}
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<edges[u].size();i++){
--indge[edges[u][i]];
if(indge[edges[u][i]]==0){
q.push(edges[u][i]);
}
}
}
for(int i=0;i<numCourses;i++){
if(indge[i]!=0){//判断所有结点的入度是否全为零
return false;
}
}
return true;
}