zoukankan      html  css  js  c++  java
  • 检查图中的有向路径

          对于图的操作,貌似这是第一次遇到,剑指offer里面貌似没有,对图的数据结构和表示有了一定的了解。

     1 /*****************************************************
     2 * file Path.cpp
     3 * date 2016/05/30 15:03
     4 
     5 * 问题描述:
     6 对于一个有向图,请实现一个算法,找出两点之间是否存在一条路径。
     7 给定图中的两个结点的指针UndirectedGraphNode* a,UndirectedGraphNode* b(请不要在意数据类型,图是有向图),请返回一个bool,
     8 代表两点之间是否存在一条路径(a到b或b到a)。
     9 
    10 * 问题分析:
    11 这个题目考察的其实是有向图的遍历,图的遍历分为深度优先遍历和广度优先遍历,深度优先遍历用堆栈实现,广度优先遍历用队列实现,在该题目中给出了每个节点的子节点,所以最好用广度优先遍历。
    12 图的广度优先遍历和树的层次遍历类似,但是不是完全相同,因为图是连通的,所以我们必须去标志那个节点被访问过,那个节点没有被访问过,最后如果全部访问完以后,还没有找到a到b的路径,则返回false。
    13 注意知识点:
    14 (1)图中有环,记得标记是否被访问
    15 (2)要分别检测两个方向(a->b,b->a)
    16 
    17 
    18 *****************************************************/
    19 #include<iostream>
    20 using namespace std;
    21 #include <vector>
    22 #include <map>
    23 #include <queue>
    24 
    25 struct UndirectedGraphNode
    26 {
    27     int label;
    28     vector<struct UndirectedGraphNode*> neighbors;
    29     UndirectedGraphNode(int x) :label(x){}
    30 };
    31 class Path
    32 {
    33 public:
    34     bool checkPath(UndirectedGraphNode* a, UndirectedGraphNode* b)
    35     {
    36         return check(a, b) || check(b,a);
    37     }
    38     bool check(UndirectedGraphNode* a, UndirectedGraphNode* b)
    39     {
    40       if (a==nullptr||b==nullptr)
    41       {
    42           return false;
    43       }
    44       if (a==b)
    45       {
    46           return true;
    47       }
    48       map<UndirectedGraphNode*, bool> mapNode;
    49       queue<UndirectedGraphNode*> que;
    50       que.push(a);
    51       while (!que.empty())
    52       {
    53           UndirectedGraphNode* ptr = que.front();
    54           mapNode[ptr] = true;
    55           for (int i = 0; i < ptr->neighbors.size();i++)
    56           {
    57               if (ptr->neighbors[i]==b)
    58               {
    59                   return true;
    60               }
    61               if (ptr->neighbors[i]&&mapNode[ptr->neighbors[i]]!=true)
    62               {
    63                   que.push(ptr->neighbors[i]);
    64               }
    65           }
    66           que.pop();
    67       }
    68       return false;
    69     }
    70 };
  • 相关阅读:
    JSP application用法
    JSP到底内置了几大对象?
    ConcurrentHashMap之实现细节 5
    假如我是JAVA开发人员
    jBPM
    ServletContext与ServletConfig分析
    oracle建立索引原则
    70个新鲜实用的JavaScript和Ajax技术(上)
    ConcurrentHashMap之实现细节
    ConcurrentHashMap之实现细节3
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/5542661.html
Copyright © 2011-2022 走看看