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 }
  • 相关阅读:
    [React Native] Error Handling and ActivityIndicatorIOS
    [GIF] Colors in GIF Loop Coder
    [React Native] Passing data when changing routes
    [Javascript] Object.freeze() vs Object.seal()
    [React Native] State and Touch Events -- TextInput, TouchableHighLight
    [GIF] GIF Loop Coder
    [GIF] GIF Loop Coder
    [Angular 2] ROUTING IN ANGULAR 2 REVISITED
    Log文件太大,手机ROM空间被占满
    strcpy,memcpy,memmove和内存重叠分析
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4606384.html
Copyright © 2011-2022 走看看