[프로그래머스] [C++] 가장 먼 노드 (bfs)
2021. 3. 9. 20:08ㆍ알고리즘/프로그래머스
1. 문제
n개의 노드가 있는 그래프
=> 각 노드는 1부터 n까지 번호가 적혀있다.
1번 노드에서 가장 멀리 떨어진 노드의 갯수를 구하려고한다.
가장 멀리 떨어진 노드란 최단 경로로 이동햇을 때 간선의 개수가 가장 많은 노드를 의미한다.
노드의 개수 n은 2 이상 20,000이하이다.
간선은 양방향이며 총 1개이상 50,000개 이하의 간선이 있다.
vertex 배열 각 행 [a, b] 는 a번 노드와 b번 노드 사이에 간선이 있다는 의미이다.
2. 너비우선 탐색
그래프의 최단거리를 구하는 방법은 여러가지가 있다.
그 중 한점을 기준으로 하는 탐색방법은 bfs O(|V| + |E|)를 이용하는것과
bfs에 우선순위큐를 활용한 다익스트라 O(ElgV) , 간선을 기준으로 업데이트하여 구하는 벨만 포드 O(|V||E|)가 있다.
하지만 가중치가 없으므로 bfs로 전체를 탐색하면서 가장 긴 길이를 업데이트 해나가며 문제를 풀었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#include <string>
#include <vector>
#include <queue>
using namespace std;
vector<vector<int> > adj;
int bfs(int src)
{
int farthest = -1, count = 0;
vector<int> distance(adj.size(), -1);
queue<int> q;
q.push(src);
distance[src] = 0;
while(!q.empty())
{
int here = q.front(); q.pop();
int dist = distance[here];
for(int i = 0; i < adj[here].size(); i++)
{
int there = adj[here][i];
int nextDist = dist + 1;
if(distance[there] == -1)
{
if(farthest < nextDist)
{
farthest = nextDist;
count = 1;
}
else if(farthest == nextDist)
count++;
q.push(there);
distance[there] = nextDist;
}
}
}
return count;
}
int solution(int n, vector<vector<int>> edge) {
adj = vector<vector<int> > (n+1);
for(int i = 0; i < edge.size(); i++)
{
int a = edge[i][0];
int b = edge[i][1];
adj[a].push_back(b);
adj[b].push_back(a);
}
return bfs(1);
}
|
cs |
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [C++] 주식가격 (stack) (0) | 2021.03.11 |
---|---|
[프로그래머스] [C++] 전화번호 목록 (trie) (0) | 2021.03.10 |
[프로그래머스] [C++] 타겟 넘버 (dp, dfs) (0) | 2021.03.09 |
[프로그래머스] [C++] 체육복 (네트워크 플로, 탐욕법) (0) | 2021.03.06 |
[프로그래머스] [C++] 더 맵게 (queue, heap) (0) | 2021.03.05 |