루트 노드(or 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법
2-1. A와 인접한 노드들을 차례로 순회한다.
→ A와 인접한 노드가 없다면 종료한다.
2-2. A와 인접한 노드인 B를 방문했다면, A와 인접한 또 다른 노드를 방문하기 전에 B와 인접한 노드들을 전부 방문해야한다.
→ B를 시작 정점으로 DFS를 다시 시작하여 B와 인접한 노드들을 방문한다.
O(n^2)
vector<vector<int>> adjacent;
vector<int> visited;
void dfs(int node)
{
visited[node] = true;
for(int i = 0; i <= adjacent.size(); i++)
{
if(adjacent[node][i] == 1 && !visited[i])
dfs(i);
}
}
// N개의 정점을 모두 방문하는 N번의 loop
O(n+e)
vector<vector<int>> adjacent;
vector<int> visited;
void dfs(int node)
{
visited[node] = true;
for(int i = 0; i < adjacent[node].size(); i++)
{
int next = adjacent[node][i];
if(!visited[next])
dfs(next);
}
}
// DFS 하나당 각 정점에 연결되어 있는 간선의 개수만큼 탐색을 하게 된다.
// 모든 정점을 한 번씩 다 방문하고 모든 간선을 한 번씩 검사
References:
https://gmlwjd9405.github.io/2018/08/14/algorithm-dfs.html
https://currygamedev.tistory.com/10