๐ป
[์๊ณ ๋ฆฌ์ฆ][DFS์BFS ์์ ์ ๋ณต] ๊ทธ๋ํ์ ํํ ๋ณธ๋ฌธ
[์๊ณ ๋ฆฌ์ฆ][DFS์BFS ์์ ์ ๋ณต] ๊ทธ๋ํ์ ํํ
๋ํจ๋ 2020. 2. 29. 18:53์ด๋์ ๋ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด๋ฅผ ํด ๋ณธ ์ฌ๋์ด๋ผ๋ฉด ์๊ฒ ์ง๋ง ๋ชจ๋ ์ฝ๋ฉํ ์คํธ์ ๊ฑฐ์ ๋จ๊ณจ๋ก ์ถ์ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ๋ก DFS, BFS ์ด๋ค.
๋ฐฑ์ค ๋ฌธ์ ํ์ด๋ฅผ ํ๋ฉด์ ๊ฐ์ฅ ๋๋ฅผ ํ๋ค๊ฒ ํ๋ ๊ฒ๋ ๋ฐ๋ก DFS์BFS!! ๊ทธ๋์ ๋์ ๊ฐ์ด ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด ์๋ด๊ธฐ ์์ด๋ณด๋ค์ ์ํด ์์ ์ ๋ณต์ด๋ผ๋ ์นดํ ๊ณ ๋ฆฌ๋ก ์ฌ๋ฆฌ๊ณ ์ ํ๋ค. ๊ธ์ ์ฐ๋ฉด์ ๋๋ ๊ณต๋ถํ๊ณ , ์๋ฃ๊ฐ ๋ถ๋ ๋์์ด ๋๊ธธ ๋ฐ๋ผ๋ ๋ง์์ ๋๋ค :)
1. ๊ทธ๋ํ ํํ
์ธ์ ํ๋ ฌ
- ์๋ฐฉํฅ ๊ทธ๋ํ ์ผ ๋ A[i][j], A[j][i]
- ์ธ์ ํ๋ ฌ์ ์๋ ๊ฐ์ ๋ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์์ฃผ ์ฐ์ด์ง๋ ์๋๋ค. ์ฌ์ด ๋ฌธ์ ๋ฅผ ํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
- ์ธ์ ํ๋ ฌ์ ๊ณต๊ฐ ๋ณต์ก๋๋ O(V^2)์ด๋ค.
- ๊ฐ์ค์น๊ฐ ์๋ ๊ฒฝ์ฐ)
#include <cstdio>
#include <vector>
int a[10][10];
int main(){
int n,m;
scanf("%d %d", &n, &m);
for(int i=0; i<m; i++){
int u,v;
scanf("%d %d", &u, &v);
a[u][v] = 1;
a[v][u] = 1; //๋จ๋ฐฉํฅ ๊ทธ๋ํ์ผ๋๋ ํ์์๋ค
}
}
- ๊ฐ์ค์น๊ฐ ์๋ ๊ฒฝ์ฐ)
- ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ๊ฐ์ค์น ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด๋๋ค. A[i][j] = W
#include <cstdio>
#include <vector>
int a[10][10];
int main(){
int n,m;
scanf("%d %d", &n, &m);
for(int i=0; i<m; i++){
int u,v,w;
scanf("%d %d %d", &u, &v, &w);
a[u][v] = w;
a[v][u] = w
}
}
์ธ์ ๋ฆฌ์คํธ
- ์ธ์ ๋ฆฌ์คํธ์ ๊ณต๊ฐ ๋ณต์ก๋๋ O(E) ์ด๋ค.
- ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํผ๋ค.
- ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด์ ๊ตฌํํ๋ค.
- A[i] = i์ ์ฐ๊ฒฐ๋ ์ ์ ์ ๋งํฌ๋ ๋ฆฌ์คํธ๋ก ํฌํจํ๊ณ ์๋ค.
- ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ํ์ํ ๋งํผ๋ง ๊ณต๊ฐ์ ํ์ฉํ๋ ค๋ ๊ฒ์ธ๋ฐ ๊ตฌํํ๊ธฐ์ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์, ์ฃผ๋ก c++์ vector๋ ์๋ฐ์ arraylist์ ๊ฐ์ด ๊ธธ์ด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๋ฐฐ์ด์ ์ด์ฉํด์ ๊ตฌํํ๋ค.
โป ๋ฒกํฐ๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ ํ ์
vector<int> a(10) => ํฌ๊ธฐ๊ฐ 10์ธ ์ผ์ฐจ์ ๋ฐฐ์ด int a[10]
vector<int> a[10] => ๋ฐฐ์ด์ ์๋ฏธ vector<int> a๊ฐ 10๊ฐ ์๋ค๋ ๊ฒ
- ๊ฐ์ค์น๊ฐ ์๋ ๊ฒฝ์ฐ)
#include <cstdio>
#include <vector>
using namespace std;
vector<int> a[10];
int main(){
int n,m;
scanf("%d %d", &n, &m);
for(int i=0; i<m; i++){
int u,v;
scanf("%d %d", &u, &v);
a[u].push_back(v);
a[v].push_back(u);
}
}
- ๊ฐ์ค์น๊ฐ ์๋ ๊ฒฝ์ฐ)
- pair๋ฅผ ์ด์ฉํ์ฌ ์ ์ ๊ณผ ๊ฐ์ค์น ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
#include <cstdio>
#include <vector>
using namespace std;
vector<pair<int,int>> a[10];
int main(){
int n,m;
scanf("%d %d", &n, &m);
for(int i=0; i<m; i++){
int u,v,w;
scanf("%d %d %d", &u, &v, &w);
a[u].push_back(make_pair(v,w));
a[v].push_back(make_pair(u,w));
}
}
๊ฐ์ ๋ฆฌ์คํธ
- ์ธ์ ํ๋ ฌ๊ณผ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ ๋ฆฌ์คํธ ๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ๊ทธ๋ํ๋ฅผ ์ ์ฅํ ์ ์๋ค.
- ๋๋ถ๋ถ์ ๋ฌธ์ ๋ ์ธ์ ๋ฆฌ์คํธ๋ก ํ๋ฆฌ๊ธฐ๋๋ฌธ์ ๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ ์ผ์ ์ฌ์ค ๋ง์ง ์๋ค.
- ๋ฐฐ์ด์ ์ด์ฉํด์ ๊ตฌํํ๋ค.
- ๊ฐ์ ์ ๋ชจ๋ ์ ์ฅํ๊ณ ์๋ค.
- E๋ผ๋ ๋ฐฐ์ด์ ๊ฐ์ ์ ๋ชจ๋ ์ ์ฅํ๋ค.
- O(E)์ ๊ณต๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
- ๊ฐ ๊ฐ์ ์ ์ ์ ์ ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์๋ฅผ ์ผ๋ค.
i 0 1 2 3 4 5
cnt[i] 0 2 4 2 4 3
- ๊ทธ ๋ค์์๋ cnt ๋ฐฐ์ด์ ์์์๋ถํฐ ๋์ ํ๋ฉด์ ๊ตฌํ๋ค. cnt[i] = cnt[i-1]+cnt[i]
i 0 1 2 3 4 5
cnt[i] 0 2 6 8 12 15
- i๋ฒ ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ E๋ฐฐ์ด์์ cnt[i-1]๋ถํฐ cnt[i]-1 ๊น์ง์ด๋ค.
์) 3๋ฒ ์ ์ : cnt[2] ~ cnt[3] - 1 = 6 ~ 7
๋ค์๊ธ)