71 课程表
1.问题描述
你必须选修 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;
}
2.输入说明
首先输入numCourses和先决条件的数目m
然后输入m行,每行两个整数,表示先决条件中的两门课程编号。
1 <= numCourses <= 2000
3.输出说明
输出true或false
4.范例
输入
2 2
1 0
0 1
输出
false
5.代码
#include<iostream>
#include<map>
#include<string>
#include<unordered_map>
#include<algorithm>
#include<string.h>
#include<sstream>
#include <vector>
#include<queue>
using namespace std;
bool canFinish(int numCourses, vector<vector<int>> prerequisites)
{
//拓扑排序,选择入度为0的节点【BFS】
vector<int> Indegrees(numCourses);//记录每个点入度,注意这里要确定数组大小
unordered_map<int, vector<int> >map;//记录依赖该节点的其他节点
for (int i = 0; i < prerequisites.size(); i++)
{
Indegrees[prerequisites[i][0]]++;
map[prerequisites[i][1]].push_back(prerequisites[i][0]);//记录依赖该节点的其他节点
}
queue <int>q;//BFS要用队列
for (int i = 0; i < Indegrees.size(); i++)
{
if (Indegrees[i] == 0)//将所有入度为0的节点入队
q.push(i);
}
int cnt = 0;//用来记录已经学过的课程数,判断是否等于课程总数即可
while (q.size()>0)
{
int selected = q.front();//已经选择的课程下标
q.pop();//出队
cnt++;//选课数加一
//在map中获取这门课程的依赖课程
vector<int>deps = map[selected];
//更新依赖课程的入度
if (deps.size() > 0)
{
for (int i = 0; i < deps.size(); i++)
{
Indegrees[deps[i]]--;
if (Indegrees[deps[i]] == 0)//若入度减1后,该节点变成入度为0 ,入队
q.push(deps[i]);
}
}
}
//在队列为空时,判断cnt是否等于总节点数
return cnt == numCourses ? true : false;
}
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;
}