题目描述
对于一个有向图,请实现一个算法,找出两点之间是否存在一条路径。
给定图中的两个结点的指针DirectedGraphNode* a, DirectedGraphNode* b(请不要在意数据类型,图是有向图),请返回一个bool,代表两点之间是否存在一条路径(a到b或b到a)。
注意的点:
1.如果有环,不标记的话就可能无限遍历了
2.是有向路径,a ->b, b ->a都可以。(错在这儿)
3.最好将UndirectedGraphNode *最为判断访问过的标志,万一如果有label相等的话,将label作为标记的方法就失效了。
4.用unordered_map会节省性能一点。
/*
struct UndirectedGraphNode {
int label;
vector<struct UndirectedGraphNode *> neighbors;
UndirectedGraphNode(int x) : label(x) {}
};*/
class Path {
public:
bool checkPath(UndirectedGraphNode* a, UndirectedGraphNode* b) {
// write code here
return fun(a, b) || fun(b,a);
}
bool fun(UndirectedGraphNode* a, UndirectedGraphNode* b)
{
if(a == NULL || b == NULL)
return false;
map<UndirectedGraphNode*, bool> hash;
queue<UndirectedGraphNode*> q;
q.push(a);
hash[a] = true;
while(!q.empty())
{
UndirectedGraphNode *temp = q.front();
q.pop();
if(temp == b)
return true;
for(int i = 0; i < temp ->neighbors.size(); ++i)
{
if(temp ->neighbors[i] && hash[temp ->neighbors[i]] == false)
{
q.push(temp ->neighbors[i]);
hash[temp ->neighbors[i]] = true;
}
}
}
return false;
}
};