作者:
晚于: 2020-08-26 12:00:00后提交分数乘系数50%
截止日期: 2020-09-02 12:00:00
问题描述 :
你必须选修 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。这是不可能的。
提示:
输入的先决条件是由边组成,每条边包含两个元素,比如[1,0],表示学习课程 1 之前,需要先完成课程 0
你可以假定输入的先决条件中没有重复的边。
可使用以下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=Solution().canFinish(numCourses,prerequisites);
cout<<(res?"true":"false")<<endl;
return 0;
}
输入说明 :
首先输入numCourses和先决条件的数目m
然后输入m行,每行两个整数,表示先决条件中的两门课程编号。
1 <= numCourses <= 2000
输出说明 :
输出true或false
输入范例 :
输出范例 :
#include <iostream> #include <vector> #include <queue> using namespace std; class Solution { private: vector<vector<int>> edges; vector<int> indegree;//保存每个点的入度 public: bool canFinish(int numCourses, vector<vector<int>>& prerequisites) { edges.resize(numCourses) ; indegree.resize(numCourses); for(const auto &t:prerequisites) { edges[t[1]].push_back(t[0]); ++indegree[t[0]]; } queue<int> Q; for(int i=0;i<numCourses;i++) if(indegree[i]==0) Q.push(i);//先将所有入度为0的顶点存入队列 int visited=0; while(!Q.empty()) { ++visited;//访问出所有入度为0的点 int temp=Q.front(); Q.pop(); for(int u:edges[temp]) { --indegree[u]; if(indegree[u]==0) Q.push(u); } } return visited==numCourses;//如果能够全部访问出所有顶点,证明无环 } }; 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=Solution().canFinish(numCourses,prerequisites); cout<<(res?"true":"false")<<endl; return 0; }