반응형
두 노드간의 거리를 계산하는 문제이므로 BFS를 사용하는 것이 더 적합하나, DFS로도 풀어 보았다.
BFS 풀이
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
int N, M, A, B;
vector<int> a[101];
bool visited[101]={false, };
void BFS() {
queue<pair<int, int>> q;
q.push({A, 0});
int now = A;
int len = 0;
visited[A]=true;
while(!q.empty()) {
now = q.front().first;
len = q.front().second;
if(now==B) {
cout << len;
return;
}
q.pop();
for(int i=0; i<a[now].size(); i++){
if(!visited[a[now][i]]) {
visited[a[now][i]]=true;
q.push({a[now][i], len+1});
}
}
}
cout << -1;
}
int main() {
cin >> N;
cin >> A >> B;
cin >> M;
for(int i=0; i<M; i++) {
int x, y;
cin >> x >> y;
a[x].push_back(y);
a[y].push_back(x);
}
for(int i=0; i<N; i++) sort(a[i].begin(), a[i].end());
BFS();
}
DFS 풀이
#include <iostream>
#include <vector>
using namespace std;
int a[101][101] = {}, v[101] = {};
int N, A, B, n, res = -1;
void DFS(int now, int cnt) {
if (now == B) {
res = cnt;
return;
}
for (int i = 1; i <= N; i++) {
if (!v[i] && a[now][i] == 1) {
v[i] = 1;
a[now][i] = 1;
a[i][now] = 1;
DFS(i, cnt + 1);
v[i] = 0;
a[now][i] = 0;
a[i][now] = 0;
}
}
}
int main(void) {
cin >> N;
cin >> A >> B;
cin >> n;
for (int i = 0; i < n; i++) {
int x, y;
cin >> x >> y;
a[x][y] = 1;
a[y][x] = 1;
}
DFS(A, 0);
cout << res;
}
'PS' 카테고리의 다른 글
[PS] 백준 7569번 - 토마토 (0) | 2023.05.17 |
---|---|
[PS] 백준 2468번 - 안전 영역 (0) | 2023.05.17 |
[PS] 백준 5014번 - 스타트링크 (0) | 2023.05.16 |
[PS] 백준 1697번 - 숨바꼭질 (0) | 2023.05.16 |
[PS] 백준 7576번 - 토마토 (0) | 2023.05.16 |