Coding_Test_C++

BaekJoon 2644번: 촌수계산(C++/DFS/BFS)

https://www.acmicpc.net/problem/2644

 

2644번: 촌수계산

사람들은 1, 2, 3, …, n (1≤n≤100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진

www.acmicpc.net

풀이법

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);
}