问题描述
问题如下,详情可在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 (将#修改为@)