Leetcode207
拓扑排序讲解见https://blog.csdn.net/moX980/article/details/107870775
题目分析:典型的拓扑序问题
在向队列压入入度为0的值的同时ans++,最后比较ans和numCourse是否相等即可
ans表示能够到达的点(即前置条件已经达到)
PS:注意当没有给定任何前置条件时答案为true
class Solution {
public:
//链式前向星存边
//c/c++混合
struct edge{
int to, next;
};
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
if(prerequisites.size() == 0) return true;
edge edg[prerequisites.size() + 5];
int head[numCourses + 5], in_degree[numCourses + 5], edg_cnt = 0;
memset(in_degree, 0, sizeof(in_degree));
memset(head, -1, sizeof(head));
for(auto iter = prerequisites.begin(); iter != prerequisites.end(); iter++){
vector<int> vec = *iter;
edg[edg_cnt].to = vec[1];
edg[edg_cnt].next = head[vec[0]];
head[vec[0]] = edg_cnt++;
in_degree[vec[1]]++;
}
int ans = 0;
queue<int> que;
for(int i = 0; i < numCourses; i++){
//printf("indegree[%d] = %d\n", i, in_degree[i]);
if(in_degree[i] == 0) {
que.push(i);
//cout << i << endl;
ans++;
}
}
while(!que.empty()){
int t = que.front();
que.pop();
for(int i = head[t]; i != -1; i = edg[i].next){
int e = edg[i].to;
in_degree[e]--;
if(in_degree[e] == 0) {
//cout << e << endl;
que.push(e);
ans++;
}
}
}
return numCourses == ans;
}
};
class Solution {
public:
//c++口味更重一些
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
if(prerequisites.size() == 0) return true;
vector<int> in_degree(numCourses, 0);
vector<vector<int>> to(numCourses);
for(vector<int>vec : prerequisites){
in_degree[vec[1]]++;
to[vec[0]].push_back(vec[1]);
}
int ans = 0;
queue<int> que;
for(int i = 0; i < in_degree.size(); i++){
//printf("indgree[%d] = %d\n", i, in_degree[i]);
if(in_degree[i] == 0) {
//printf("push(%d)\n", i);
que.push(i);
ans++;
}
}
while(!que.empty()){
int t = que.front();
que.pop();
for(int a : to[t]){
in_degree[a]--;
if(in_degree[a] == 0){
//printf("push(%d)\n", a);
que.push(a);
ans++;
}
}
}
//cout << "ans = " << ans << endl;
return ans == numCourses;
}
};