zoukankan      html  css  js  c++  java
  • [LintCode] 拓扑排序

    BFS:

     1 /**
     2  * Definition for Directed graph.
     3  * struct DirectedGraphNode {
     4  *     int label;
     5  *     vector<DirectedGraphNode *> neighbors;
     6  *     DirectedGraphNode(int x) : label(x) {};
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     /**
    12      * @param graph: A list of Directed graph node
    13      * @return: Any topological order for the given graph.
    14      */
    15     vector<DirectedGraphNode*> topSort(vector<DirectedGraphNode*> graph) {
    16         // write your code here
    17         vector<DirectedGraphNode*> topo;
    18         unordered_map<DirectedGraphNode*, int> degrees = compute_indegree(graph);
    19         queue<DirectedGraphNode*> zeros;
    20         for (auto itr = degrees.begin(); itr != degrees.end(); itr++)
    21             if ((*itr).second == 0)
    22                 zeros.push((*itr).first);
    23         while (!zeros.empty()) {
    24             DirectedGraphNode* zero = zeros.front();
    25             zeros.pop();
    26             topo.push_back(zero);
    27             for (DirectedGraphNode* neigh : zero -> neighbors)
    28                 if (--degrees[neigh] == 0)
    29                     zeros.push(neigh);
    30         }
    31         return topo;
    32     }
    33 private:
    34     unordered_map<DirectedGraphNode*, int> compute_indegree(vector<DirectedGraphNode*>& graph) {
    35         unordered_map<DirectedGraphNode*, int> degrees;
    36         for (DirectedGraphNode* node : graph) {
    37             if (degrees.find(node) == degrees.end())
    38                 degrees[node] = 0;
    39             for (DirectedGraphNode* neigh : node -> neighbors)
    40                 degrees[neigh]++;
    41         }
    42         return degrees;
    43     }
    44 };

    DFS:

     1 /**
     2  * Definition for Directed graph.
     3  * struct DirectedGraphNode {
     4  *     int label;
     5  *     vector<DirectedGraphNode *> neighbors;
     6  *     DirectedGraphNode(int x) : label(x) {};
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     /**
    12      * @param graph: A list of Directed graph node
    13      * @return: Any topological order for the given graph.
    14      */
    15     vector<DirectedGraphNode*> topSort(vector<DirectedGraphNode*> graph) {
    16         // write your code here
    17         vector<DirectedGraphNode*> topo;
    18         unordered_set<DirectedGraphNode*> visited;
    19         for (DirectedGraphNode* node : graph)
    20             if (visited.find(node) == visited.end())
    21                 dfs(graph, node, visited, topo);
    22         reverse(topo.begin(), topo.end());
    23         return topo;
    24     }
    25 private:
    26     void dfs(vector<DirectedGraphNode*>& graph, DirectedGraphNode* node, 
    27              unordered_set<DirectedGraphNode*>& visited, 
    28              vector<DirectedGraphNode*>& topo) {
    29         visited.insert(node);
    30         for (DirectedGraphNode* neigh : node -> neighbors)
    31             if (visited.find(neigh) == visited.end())
    32                 dfs(graph, neigh, visited, topo);
    33         topo.push_back(node);
    34     }
    35 };
  • 相关阅读:
    【随机梯度下降】理解与使用
    【线性回归】波士顿房价预测
    【knn临近算法】预测年收入
    【knn近邻算法】算法实现的简单原理
    【线性回归算法】小案例之确诊病例数据预测(只用于理解预测算法理解)
    【前端】H5,底边按钮吸边,但是覆盖了列表循环的内容
    【Django组件】WebSocket的简单实现
    vue基础知识点
    ES6---Proxy的理解的使用
    Python 整数拆分
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4606310.html
Copyright © 2011-2022 走看看