Fork me on GitHub

检查图中的有向路径

      对于图的操作,貌似这是第一次遇到,剑指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 };

 

posted @ 2016-05-30 15:35  ranjiewen  阅读(446)  评论(0编辑  收藏  举报