如何解决节点/任务排序的深度优先搜索实现
问题如下,详情可在here中找到:
您总共需要选择 n 个任务,标记为从 0 到 n-1。 某些任务可能有先决任务,例如选择任务 0 你必须先完成任务1,它表示为一对:[0,1]
给定任务总数和先决条件对列表, 返回您应该选择完成所有任务的任务顺序。
vector<unordered_set<int> > make_graph(int numTasks,vector<pair<int,int> >& prerequisites)
{
vector<unordered_set<int> > graph(numTasks);
for (auto pre : prerequisites)
graph[pre.second].insert(pre.first);
return graph;
}
bool dfs(vector<unordered_set<int> >& graph,int node,vector<bool>& onpath,vector<bool>& visited,vector<int>& toposort)
{
if (visited[node])
return false;
onpath[node] = visited[node] = true;
for (int neigh : graph[node])
if (onpath[neigh] || dfs(graph,neigh,onpath,visited,toposort))
return true;
toposort.push_back(node);
return onpath[node] = false;
}
vector<int> findOrder(int numTasks,int> >& prerequisites)
{
vector<unordered_set<int> > graph = make_graph(numTasks,prerequisites);
vector<int> toposort;
vector<bool> onpath(numTasks,false),visited(numTasks,false);
for (int i = 0; i < numTasks; i++)
if (!visited[i] && dfs(graph,i,toposort))
return {};
reverse(toposort.begin(),toposort.end());
return toposort;
}
int main()
{
int numTasks = 4;
vector<pair<int,int> > prerequisites;
prerequisites.push_back(make_pair(1,0));
prerequisites.push_back(make_pair(2,1));
prerequisites.push_back(make_pair(3,2));
vector<int> v = findOrder(numTasks,prerequisites);
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
return 0;
}
我对这段代码中 vector<bool> onpath(numTasks,false)
的作用特别困惑。
vector<int> findOrder(int numTasks,toposort.end());
return toposort;
}
布尔函数 dfs
仅在 onpath
向量中的元素为真时才返回真。
bool dfs(vector<unordered_set<int> >& graph,toposort))
return true;
toposort.push_back(node);
return onpath[node] = false;
}
onpath
向量在解决方案中的实际用途是什么? 我知道拓扑排序算法的输入必须是有向无环图,如果算法遇到任何循环或循环在图形/输入中,算法终止。这是 onpath
向量的用途吗?
如果 onpath
向量的目的真的是这样,那么这条线的目的是什么:
if (!visited[i] && dfs(graph,toposort))
return {};
显然,dfs
仅在 onpath
中的元素为真时才返回真。如果发生这种情况,应该返回一个空数组是有道理的。用 visited
数组检查 dfs 结果的必要性是什么?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。