所以这个玩具问题是一个图形问题,使用dfs来查看整个课程安排是否有效,并且没有不能采取的课程,因为它的先例不能被采取等等...... / p>
我想知道在访问方法中使用throw是否是一种好习惯。因为如果我们在图中找到一个循环,我就可以抛出。现在,投掷完全忽略了堆栈并直接向下发送,直到它找到一个捕获。如果是这样,这是否意味着,而不是实现访问方法,以便在找到循环时返回false。只是抛出而不是一直向下返回false会更快?这是生产级代码的良好实践吗?还是返回bool方法更好?
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<list<int>> vMap(numCourses);
vector<bool> globalVisited(numCourses, false);
for (auto it : prerequisites){
vMap[it.first].push_back(it.second);
}
try {
for (int i=0; i<numCourses; i++){
if (globalVisited[i] != true){
vector<bool> localVisited(numCourses, false);
visit(vMap, globalVisited, localVisited, i);
}
}
}
catch (...){
return false;
}
return true;
}
void visit(vector<list<int>>& vMap, vector<bool>& globalVisited, vector<bool>& localVisited, int i){
if (globalVisited[i] == true){ //reached a deadend, try a different node
return;
}
else if (localVisited[i] == true){ //found a cycle
throw new exception;
}
localVisited[i] = true;
for (auto it : vMap[i]){
visit(vMap, globalVisited, localVisited, it);
}
globalVisited[i] = true;
}
};