https://www.acmicpc.net/problem/2644
풀이법
1) BFS와 DFS를 이용하면 쉽게 풀 수 있는 문제이다.
2) visit 배열을 두어 한 번 방문한 곳은 다시 방문 안하는 것을 활용하면 더 쉽게 풀 수 있다.
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
int n;
int a, b;
int m;
int arr[101][101];
bool visited[101];
void bfs(int a, int b)
{
queue<pair<int, int>> q;
q.push({ a,0 });
visited[a] = true;
while (!q.empty())
{
int now = q.front().first;
int cnt = q.front().second;
q.pop();
if (now == b)
{
cout << cnt;
return;
}
for (int i = 1; i <= n; i++)
{
if (arr[now][i] == 1 && visited[i]==false)
{
q.push({ i,cnt + 1 });
visited[i] = true;
}
}
}
cout << -1;
}
void dfs(int a, int b)
{
stack<pair<int, int>> st;
st.push({ a,0 });
visited[a] = true;
while (!st.empty())
{
int now = st.top().first;
int cnt = st.top().second;
st.pop();
if (now == b)
{
cout << cnt;
return;
}
for (int i = 1; i <= n; i++)
{
if (arr[now][i] == 1 && visited[i] == false)
{
st.push({ i,cnt + 1 });
visited[i] = true;
}
}
}
cout << -1;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
cin >> a >> b;
cin >> m;
int x, y;
for (int i = 0; i < m; i++)
{
cin >> x >> y;
arr[x][y] = 1;
arr[y][x] = 1;
}
//bfs(a, b);
dfs(a, b);
}
'Coding_Test_C++' 카테고리의 다른 글
BaekJoon 11724번: 연결 요소의 개수(C++) (0) | 2021.06.02 |
---|---|
LeetCode 1669번: Merge In Between Linked Lists(Python3) (0) | 2021.05.29 |
BaekJoon 7562번: 나이트의 이동(C++) (0) | 2021.05.23 |
BaekJoon: 7569번 토마토(C++) (0) | 2021.05.19 |
BaekJoon 1012번: 유기농 배추(C++ DFS/BFS) (0) | 2021.05.15 |