• [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 }
  • 相关阅读:
    (转)学习笔记viewController(欢迎指错)
    配置Xcode版本控制SVN详细步骤内含解决Xcode/Mac OS10.8无法配置SVN的解决方法(转)
    iPhone 3G/3GS(有锁)基带与导航功能
    [转]Iphone 3G/3Gs Home键失灵的根本原因和解决方法
    NSDate的常用用法(转)
    短信操作(转)
    如何在Symbian SDK下使用GCCE4(转)
    nS60_sdk_v1_2的VC6问题(转)
    如何获取应用程序图标(转)
    如何实现圆角的UITextView iphone短信发送(非系统界面)
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4606384.html
Copyright © 2020-2023  润新知