知识点
疑问
暂无
代码
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
//课程数组,存储直接后继课程
vector<vector<int> > adj(numCourses);
//入度数组,初始化为0
vector<int> inDegree(numCourses,0);
//后继,前驱
int after,before;
int len = prerequisites.size();
//对输入数据进行处理
for(int i=0;i < len;i++){
after = prerequisites[i][0];
before = prerequisites[i][1];
//添加后继
adj[before].push_back(after);
//增加入度
inDegree[after]++;
}
return topoSort(adj,inDegree,numCourses);
}
bool topoSort(vector<vector<int>>& adj,vector<int> &inDegree,int numCourses){
//初始化
//记录有多少门课学完了
int cnt = 0;
//存储的队列
queue<int> q;
//将入度为0的课程加入队列
for(int i=0;i<inDegree.size();i++){
if(inDegree[i] == 0){
q.push(i);
}
}
//循环体
while(!q.empty()){
int before = q.front();
//记得弹出
q.pop();
//学习完,+1
cnt++;
for(int i=0;i<adj[before].size();i++){
int after = adj[before][i];
inDegree[after]--;
if(inDegree[after] == 0){
q.push(after);
}
}
}
if(cnt != numCourses){
return false;
}else{
return true;
}
}
};
反思
- 模板题,直接套模板;
- 学会了vector的两种构造函数,之前一直不知道!
vector(int nSize):创建一个vector,元素个数为nSize vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
- 貌似拓扑排序的作用就是判DAG的!!!
这是我在leetcode上刷的第一道题,我发现这里的提交方式有点不一样。 如下:
- 不用写各种头文件了
- 是以一个
canFininsh()
来调用程序的,不是main()
函数了
二刷代码
模板题,套模板。
//拓扑排序模板题
class Solution {
public:
static const int maxn = 1e5+10;
vector<int> adj[maxn];
int inDegree[maxn];
int num;
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
fill(inDegree,inDegree+maxn,0);
int before,after;
num=numCourses;
for(int i=0;i<prerequisites.size();i++){
before = prerequisites[i][0];
after = prerequisites[i][1];
adj[before].push_back(after);
inDegree[after]++;
}
//接下来进行拓扑排序即可
return topoSort();
}
bool topoSort(){
int cnt=0; //用于记录有多少入队列的
queue<int> q;
for(int i=0;i<num;i++){
if(inDegree[i]==0){
q.push(i);
}
}
//接下来进行拓扑排序模板操作
while(!q.empty()){
int cur = q.front();
cnt++;
q.pop();
for(int i=0;i<adj[cur].size();i++){
int v = adj[cur][i];
inDegree[v]--;
if(inDegree[v]==0){
q.push(v);
}
}
}
if(cnt!=num){
return false;
}
return true;
}
};