《 프로그래머 면접 금 전 》 은 경로 검사 가 있다.

【 성명: 판권 소유, 전재 출처 표시, 상업 용도 로 사용 하지 마 십시오. 연락처:[email protected]] 제목 링크:http://www.nowcoder.com/practice/1b83885969f14329bf9222c1c54469a7?rp = 1 & ru = / ta / cracking - the - coding - interview & qru = / ta / cracking - the - coding - interview / question - ranking 제목 설명 은 방향 도 에 대해 하나의 알고리즘 을 실현 하여 두 점 사이 에 하나의 경로 가 존재 하 는 지 찾 아 보 세 요.그림 에 있 는 두 노드 의 포인터 Undirected Graph Node * a, Undirected Graph Node * b (데이터 형식 에 신경 쓰 지 마 십시오. 그림 은 방향 이 있 습 니 다) 를 지정 합 니 다. 두 점 사이 에 하나의 경로 (a 에서 b 또는 b 에서 a) 가 존재 하 는 지 여 부 를 나타 내 는 bool 을 되 돌려 주 십시오.사고의 간단 한 그림 의 옮 겨 다 니 는 문제 에 대해 이미 방문 한 결점 에 대해 우 리 는 표 시 를 해서 순환 을 방지 해 야 한다
/*
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
			if(a==nullptr)
				return false;
			if(b==nullptr)
				return false;
			if(a == b)
				return true;
			return hasPath(a,b) || hasPath(b,a);
		}
		bool hasPath(UndirectedGraphNode *a,UndirectedGraphNode *b)
		{
			queue<UndirectedGraphNode*> Q;
			map<int,bool> vis;
			Q.push(a);
			vis[a->label] = true;
			while(!Q.empty())
			{
				UndirectedGraphNode *cur = Q.front();
				Q.pop();
				if(cur==b)
					return true;
				for(UndirectedGraphNode *node:cur->neighbors)
				{
					if(vis[node->label]==true)
						continue;
					vis[node->label] = true;
					if(node==b)
						return true;
					Q.push(node);
				}
			}
			return false;
		}
};
.

좋은 웹페이지 즐겨찾기