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 }
  • 相关阅读:
    ubuntu下在apache部署python站点
    MySQL设置从库只读模式
    mysql数据库,创建只读用户
    BUG处理流程说明
    bug的处理流程
    nginx 502 Bad Gateway 错误解决办法
    Linux下批量替换文件内容方法
    centos 安装pecl
    php学习资源
    Docker容器进入的4种方式(转)
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4606384.html
Copyright © 2011-2022 走看看