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 }
  • 相关阅读:
    浅析全球电信运营商排名
    《时空骇客》中的远距传物理论和虫洞理论
    优秀的商业计划书一定会“动”
    手机搜索的商业模式
    手机网游排行榜
    手机按键对应表
    "Avatar模式"透析
    百度数据暗示无线互联网将以个人为中心
    一种精神致加西亚的信
    手机定位技术将成社交网络催化剂
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4606384.html
Copyright © 2011-2022 走看看