๐ป
[์๊ณ ๋ฆฌ์ฆ][DFS์BFS ์์ ์ ๋ณต] ๊ทธ๋ํ์ ํ์ ๋ณธ๋ฌธ
[์๊ณ ๋ฆฌ์ฆ][DFS์BFS ์์ ์ ๋ณต] ๊ทธ๋ํ์ ํ์
๋ํจ๋ 2020. 2. 29. 23:17์ด์ ๊ธ )
2. ๊ทธ๋ํ ํ์
DFS:๊น์ด ์ฐ์ ํ์ -> ์ต๋ํ ๊น์ํ ๋ง์ด
BFS:๋๋น ์ฐ์ ํ์ -> ์ต๋ํ ๋๊ฒ ๊ฐ๋ ๊ฒ ๋ชจ๋ ๊ฐ์ค์น๊ฐ 1์ธ๊ฒฝ์ฐ ์ต๋จ๊ฑฐ๋ฆฌ ํ์
- ์์ 2๊ฐ์ง ํ์ ๋ชจ๋ ๋ชฉ์ ์ ๋ชจ๋ ์ ์ ์ 1๋ฒ์ฉ ๋ฐฉ๋ฌธํ๋ ๊ฒ
DFS
- ์คํ์ ์ด์ฉํด์ ๊ฐ ์ ์์ ๋งํผ ์ต๋ํ ๋ง์ด ๊ฐ๊ณ ๊ฐ ์ ์์ผ๋ฉด ์ด์ ์ ์ ์ผ๋ก ๋์๊ฐ์ ํ์์ ๊ณ์ ์งํํ๋ค.
- ์ค๋ช ์ ์๋ ๊ทธ๋ฆผ์ผ๋ก ๋์ฒดํ๋ค. visited[]๋ฐฐ์ด์ ๋ฐฉ๋ฌธ ํ๋ ์ง๋ฅผ ๋ํ๋ด๋ฉฐ, ์คํ์์ ๋นจ๊ฐ์์ผ๋ก ํ์ํ ๊ฒ์ pop()์ ๋ํ๋ธ ๊ฒ์ด๋ค.
์ธ์ ํ๋ ฌ์ ์ด์ฉํ ๊ตฌํ
- ์ฌ๊ท ํธ์ถ์ ์ด์ฉํด์ ๊ตฌํํ ์ ์๋ค.
- O(V^2)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
void dfs(int x){
visited[x] = true;
printf("%d ", x);
for(int i=1; i<=n; i++){
if(a[x][i]==1 && visited[i]==false){ // ๊ฐ์ ์ด ์๊ณ , ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ
dfs(i); // i๋ฅผ ๋ฐฉ๋ฌธํ๋ค
}
}
}
์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ๊ตฌํ
- ์ฌ๊ท ํธ์ถ์ ์ด์ฉํด์ ๊ตฌํํ ์ ์๋ค.
- a[x] : x์ ์ฐ๊ฒฐ๋ ์ ์
- ์ธ์ ๋ฆฌ์คํธ์ ๊ฒฝ์ฐ ํญ์ ์๋ ๊ฐ์ ๋ง ์ ์ฅ๋์ด์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ด ์๋์ง ์ฒดํฌํ ํ์๊ฐ ์๋ค.
- ๋ชจ๋ ์ ์ ๊ณผ ๋ชจ๋ ๊ฐ์ ์ ํ๋ฒ์ฉ๋ง ๋ฐฉ๋ฌธํ๊ธฐ ๋๋ฌธ์ O(V+E) ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
void dfs(int x){
visited[x] = true;
printf("%d ", x);
for(int i=0; i<a[x].size() ; i++){
int y = a[x][i];
if(visited[y] == false){ // ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉด ๋ฐฉ๋ฌธํ๋ค
dfs(y);
}
}
}
BFS
- ํ๋ฅผ ์ด์ฉํด์ ํ์ฌ ์์น์์ ๊ฐ ์ ์๋ ๊ฒ์ ๋ชจ๋ ํ์ ๋ฃ๋ ๋ฐฉ์์ด๋ค.
- ํ์ ๋ฃ์ ๋ ๋ฐฉ๋ฌธํ๋ค๊ณ ์ฒดํฌ ํด์ผํ๋ค.
- visited[]๋ฐฐ์ด์ ๋ฐฉ๋ฌธํ๋ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ฐฐ์ด์ด๊ณ , ํ์ ๋นจ๊ฐ์ ์ซ์๋ pop()์ ๋ํ๋ธ๋ค.
์ธ์ ํ๋ ฌ์ ์ด์ฉํ ๊ตฌํ
- Queue ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด์ ๊ตฌํํ ์ ์๋ค.
- dfs์ ๋ง์ฐฌ๊ฐ์ง๋ก O(V^2) ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
- visited[] : boolํ์ ์ผ๋ก ๋ฐฉ๋ฌธํ์ผ๋ฉด true, ๋ฐฉ๋ฌธํ์ง ์์ผ๋ฉด false์ด๋ค.
queue <int> q;
visited[1] = true; q.push(1); // ์์์
while(!q.empty()){
int x = q.front();
q.pop();
printf("%d ",x);
for(int i=1; i<=n; i++){
if(a[x][i]==1 && visited[i]==false){
visited[i] = true;
q.push(i);
}
}
}
์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ๊ตฌํ
- Queue ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด์ ๊ตฌํํ ์ ์๋ค.
- dfs์ ๋ง์ฐฌ๊ฐ์ง๋ก O(V+E)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
queue <int> q;
visited[1] = true; q.push(1); // ์์์
while(!q.empty()){
int x = q.front();
q.pop();
printf("%d ",x);
for(int i=1; i<=a[x].size(); i++){
int y = a[x][i];
if(visited[y] == false){
visited[y] = true;
q.push(y);
}
}
}
์! ์ด์ ์ง๊ธ๊น์ง ๊ณต๋ถํ๋ DFS์BFS ๋ฅผ ์ด์ฉํด์ ํ ์ ์๋ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ๋์ ํด๋ณด์
+ ๋ฌธ์ ํ๊ธฐ / ํด์ค)
2020/03/01 - [์๊ณ ๋ฆฌ์ฆ/๋ฌธ์ ํ์ด] - [๋ฐฑ์ค] DFS์BFS - 1260.DFS์ BFS