微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

节点/任务排序的深度优先搜索实现

如何解决节点/任务排序的深度优先搜索实现

问题如下,详情可在here中找到:

您总共需要选择 n 个任务,标记为从 0 到 n-1。 某些任务可能有先决任务,例如选择任务 0 你必须先完成任务1,它表示为一对:[0,1]

给定任务总数和先决条件对列表, 返回您应该选择完成所有任务的任务顺序。

页面上给出的解决方案之一利用基于 DFS 的拓扑排序实现。

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 举报,一经查实,本站将立刻删除。