• 《Cracking the Coding Interview》——第4章:树和图——题目2


    2014-03-19 03:32

    题目:给定一个有向图,判断其中两点是否联通。

    解法:DFS搜索解决,如果是无向图的话,就可以用并查集高效解决问题了。

    代码:

      1 // 4.2 Write a program to check if there exists a path between two nodes in a directed graph.
      2 #include <algorithm>
      3 #include <cstdio>
      4 #include <unordered_map>
      5 #include <unordered_set>
      6 #include <vector>
      7 using namespace std;
      8 
      9 struct  GraphNode {
     10     int label;
     11     unordered_set<GraphNode *> neighbors;
     12     
     13     GraphNode(int _label = 0): label(_label) {};
     14 };
     15 
     16 bool hasPath(GraphNode *n1, GraphNode *n2, unordered_set<GraphNode *> &checked, vector<GraphNode *> &path)
     17 {
     18     if (n1 == nullptr || n2 == nullptr) {
     19         return false;
     20     }
     21     
     22     checked.insert(n1);
     23     path.push_back(n1);
     24 
     25     if (n1 == n2) {
     26         return true;
     27     }
     28 
     29     unordered_set<GraphNode *>::iterator it;
     30     for (it = n1->neighbors.begin(); it != n1->neighbors.end(); ++it) {
     31         if (checked.find(*it) == checked.end()) {
     32             if (hasPath(*it, n2, checked, path)) {
     33                 return true;
     34             }
     35         }
     36     }
     37     checked.erase(n1);
     38     path.pop_back();
     39     return false;
     40 }
     41 
     42 void constructGraph(int n, vector<GraphNode *> &nodes)
     43 {
     44     int i;
     45     int ne, x, y;
     46     int label;
     47     
     48     nodes.resize(n);
     49     for (i = 0; i < n; ++i) {
     50         scanf("%d", &label);
     51         nodes[i] = new GraphNode(label);
     52     }
     53     
     54     scanf("%d", &ne);
     55     for (i = 0; i < ne; ++i) {
     56         scanf("%d%d", &x, &y);
     57         nodes[x]->neighbors.insert(nodes[y]);
     58     }
     59 }
     60 
     61 void clearGraph(vector<GraphNode *> &nodes)
     62 {
     63     int n = (int)nodes.size();
     64     int i;
     65     
     66     for (i = 0; i < n; ++i) {
     67         nodes[i]->neighbors.clear();
     68         delete nodes[i];
     69         nodes[i] = nullptr;
     70     }
     71     nodes.clear();
     72 }
     73 
     74 int main()
     75 {
     76     int n;
     77     vector<GraphNode *> nodes;
     78     vector<GraphNode *> path;
     79     unordered_set<GraphNode *> checked;
     80     int idx1, idx2;
     81     
     82     while (scanf("%d", &n) == 1 && n > 0) {
     83         constructGraph(n, nodes);
     84         while (scanf("%d%d", &idx1, &idx2) == 2 && (idx1 >= 0 && idx2 >= 0)) {
     85             if (idx1 >= n || idx2 >= n) {
     86                 continue;
     87             }
     88 
     89             if (hasPath(nodes[idx1], nodes[idx2], checked, path)) {
     90                 printf("Yes
    ");
     91                 printf("%d", path[0]->label);
     92                 for (int i = 1; i < (int)path.size(); ++i) {
     93                     printf("->%d", path[i]->label);
     94                 }
     95                 printf("
    ");
     96             } else {
     97                 printf("No
    ");
     98             }
     99             checked.clear();
    100             path.clear();
    101         }
    102         clearGraph(nodes);
    103     }
    104     
    105     return 0;
    106 }
  • 相关阅读:
    性能测试必备知识(10)- Linux 是怎么管理内存的?
    stat 命令家族(4)- 详解 iostat
    stat 命令家族(3)- 详解 mpstat
    stat 命令家族(2)- 详解 pidstat
    性能分析(6)- 如何迅速分析出系统 CPU 的瓶颈在哪里
    性能分析(5)- 软中断导致 CPU 使用率过高的案例
    实体类转xml
    运气一直好,就不只是运气了——记中学七年
    (数据科学学习手札93)利用geopandas与PostGIS进行交互
    JVM系列之一:内存区域和内存溢出
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3610469.html
Copyright © 2020-2023  润新知