본문 바로가기
Algorithm/DFS&BFS(완전탐색)

2644 촌수 계산

by neohtux 2020. 7. 13.
728x90

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

 

2644번: 촌수계산

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

www.acmicpc.net

 

(풀이)

문제 접근

1. 인접리스트를 이용한 BFS

 

2. 기본적인 인접리스트를 이용한 BFS를 구현할 수 있는지 묻는 문제 vector<vector<int>> v 로

2차원 연결리스트를 만들고, 해당 노드와 연결된 부분을 입력과 함께 연결시켜줌.

 

3. 시작점부터 도착지점을 찾을때까지 너비우선탐색, DFS로도 풀리는 문제이다.

 

4. 못찾으면 -1출력.

 

#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int N; //Node Count;
int from, to;
bool check[101];
void bfs(int Start_Node, vector<vector<int>> &v);
int list_count;
queue<pair<int,int>> q;
int main(void)
{
	cin >> N;
	vector<vector<int>> v(N+1);
	cin >> from >> to;
	cin >> list_count;
	
	int input_a, input_b;
	for (int i = 0; i < list_count; ++i)
	{
		cin >> input_a >> input_b;
		v[input_a].push_back(input_b);
		v[input_b].push_back(input_a);
	}
	 
	
	q.push(make_pair(from,0));
	check[from] = true;
	bfs(from,v);
	return 0;
}
void bfs(int Start_Node, vector<vector<int>> &v)
{
	while (!q.empty())
	{
		int node = q.front().first;
		int dist = q.front().second;
		if (node == to)
		{
			cout << dist << '\n';
			return;
		}
		q.pop();
		for (int i = 0; i < v[node].size(); ++i)
		{
			int next_node = v[node][i];
			if (check[next_node] == false)
			{
				check[next_node] = true;
				q.push(make_pair(next_node, dist + 1));
			}
		}
	}
	cout << -1 << '\n';
	return;
}
300x250

'Algorithm > DFS&BFS(완전탐색)' 카테고리의 다른 글

2468 안전영역  (0) 2020.07.13
9205 맥주 마시면서 걸어가기  (0) 2020.07.13
16928 뱀과 사다리 게임  (0) 2020.05.10
2668 숫자 고르기  (0) 2020.03.09
10026 적록색약  (0) 2020.02.24

댓글