【发布时间】:2018-02-07 07:21:48
【问题描述】:
我正在尝试挑战 leetcode 上的问题 210,但我遇到了编译错误,我无法找出我的代码有什么问题。
错误是这样的
required from '_InputIterator std::__find_if(_InputIterator, _InputIterator, _Predicate, std::input_iterator_tag)
[with _InputIterator = std::_Rb_tree_iterator<std::pair<const int, bool> >;
_Predicate = __gnu_cxx::__ops::_Iter_equals_val<const int>]'
我把它复制到IDE中,并尝试运行它,我仍然找不到问题,因为IDE没有显示导致编译错误的行。
问题需要找出一个人应该完成所有课程的课程顺序,给定存储在成对的 c++ 向量中的课程先决条件。
为了解决这个问题,我首先尝试将pair的向量转换为一个向量> 记录从一个点(课程)到另一个节点(课程)的边,并记录一个节点是否是另一个节点的儿子,因此它不是树的根。 我首先尝试找出图中是否有任何环。 然后我使用 BFS 搜索图形并返回节点的访问顺序。
vis map 用于记录在查找图中是否访问过某个节点以查找图中的环。 globalVis map用于记录一个节点是否在之前由其他节点启动的搜索中被访问过,因此不需要再次作为起始节点进行搜索。
请告诉我是哪一行代码导致了编译错误,以及如何纠正它,谢谢。
class Solution {
public:
vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<int> res;
edges = vector<vector<int>>(numCourses,vector<int>());
for(int i=0;i<prerequisites.size();i++){
edges[prerequisites[i].first].push_back(prerequisites[i].second);
isRoot[prerequisites[i].second]=false;
}
for(int i=0;i<numCourses;i++){
if(find(globalVis.begin(),globalVis.end(),i)==globalVis.end()){
globalVis[i]=true;
vis.clear();
vis[i]=true;
if(!checkStartNode(i))
return res;
}
}
for(int i=0;i<numCourses;i++){
if(find(isRoot.begin(),isRoot.end(),i)==isRoot.end()){
toVisit.push(i);
}
}
vis.clear();
BFS(res);
return res;
}
void BFS(vector<int>& res){
while(toVisit.size()>0){
int node = toVisit.top();
vis[node]=true;
toVisit.pop();
res.push_back(node);
for(int i=0;i<edges[node].size();i++){
int nextNode = edges[node][i];
if(find(vis.begin(),vis.end(),nextNode)==vis.end())
toVisit.push(nextNode);
}
}
}
bool checkStartNode(int node){
for(int i=0;i<edges[node].size();i++){
int nextNode = edges[node][i];
if(find(vis.begin(),vis.end(),nextNode)!=vis.end()){
globalVis[nextNode]=true;
if(vis[nextNode]==true)
return false;
else{
vis[nextNode]=true;
if(!checkStartNode(nextNode))
return false;
vis[nextNode]=false;
}
}
else{
vis[nextNode]=true;
if(!checkStartNode(nextNode))
return false;
vis[nextNode]=false;
}
}
}
stack<int> toVisit;
vector<vector<int>> edges;
map<int,bool> isRoot;
map<int,bool> vis;
map<int,bool> globalVis;
};
【问题讨论】:
标签: c++ dictionary vector find