zoukankan      html  css  js  c++  java
  • [hihoCoder] 拓扑排序·一

    The hints of the problem has given detailed information to implement the topological sorting algorithm. In fact, the toposort algorithm of the hint is the BFS version, which uses the indegrees of each node.

    The code is as follows.

     1 #include <iostream>
     2 #include <vector>
     3 #include <queue>
     4 
     5 using namespace std;
     6 
     7 struct DirectedGraphNode {
     8     int label;
     9     vector<int> neighbors;
    10     DirectedGraphNode(int i) : label(i) {}
    11 };
    12 
    13 vector<DirectedGraphNode*> init_graph(int nodes) {
    14     vector<DirectedGraphNode*> graph(nodes);
    15     for (int i = 0; i < nodes; i++)
    16         graph[i] = new DirectedGraphNode(i);
    17     return graph;
    18 }
    19 
    20 vector<int> compute_indegree(vector<DirectedGraphNode*>& graph) {
    21     vector<int> degrees(graph.size(), 0);
    22     for (int i = 0; i < (int)graph.size(); i++)
    23         for (int j = 0; j < (int)graph[i] -> neighbors.size(); j++)
    24             degrees[graph[i] -> neighbors[j]]++;
    25     return degrees;
    26 }
    27 
    28 bool noCycle(vector<DirectedGraphNode*>& graph) {
    29     vector<int> degrees = compute_indegree(graph);
    30     int nodes = graph.size();
    31     queue<int> zeros;
    32     for (int i = 0; i < (int)degrees.size(); i++)
    33         if (!degrees[i]) zeros.push(i);
    34     while (!zeros.empty()) {
    35         int zero = zeros.front();
    36         zeros.pop();
    37         for (int i = 0; i < (int)graph[zero] -> neighbors.size(); i++)
    38             if (--degrees[graph[zero] -> neighbors[i]] == 0)
    39                 zeros.push(graph[zero] -> neighbors[i]);
    40         nodes--;
    41     }
    42     return nodes == 0;
    43 }
    44 
    45 int main(void) {
    46     int cases;
    47     scanf("%d", &cases);
    48     for (int i = 0; i < cases; i++) {
    49         int nodes, edges;
    50         scanf("%d %d", &nodes, &edges);
    51         vector<DirectedGraphNode*> graph = init_graph(nodes);
    52         int node, neigh;
    53         for (int j = 0; j < edges; j++) {
    54             scanf("%d %d", &node, &neigh);
    55             graph[node - 1] -> neighbors.push_back(neigh - 1);
    56         }
    57         if (noCycle(graph)) printf("Correct
    ");
    58         else printf("Wrong
    ");
    59     }
    60     return 0;
    61 }
  • 相关阅读:
    URAL 1207 极角排序
    URAL 1348 求垂足
    POJ 3608 旋转卡壳
    POJ 2954 Pick定理
    POJ 2007 叉积排序
    UVA 10002 凸多边形重心
    [转]bad interpreter:No such file or directory的原因
    [转]实现Python HTTP服务方法大总结
    urllib2.HTTPError: HTTP Error 403: Forbidden 错误
    C++二分查找代码
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4606384.html
Copyright © 2011-2022 走看看