Notice
Recent Posts
Recent Comments
Link
250x250
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

피너클의 it공부방

백준 2644 촌수계산 (c++) : 피너클 본문

백준

백준 2644 촌수계산 (c++) : 피너클

피너클 2022. 9. 2. 19:02
728x90
반응형

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

 

2644번: 촌수계산

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

www.acmicpc.net

브루트포스를 이용해 풀었다.

int n, m; 
int a, b;

bool visited[101];
vector<int> v[101];

사용할 변수다.

cin >> n;
cin >> a >> b;
cin >> m;
memset(visited, false, sizeof(visited));
for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    v[a].push_back(b);
    v[b].push_back(a);
}

값들을 입력받고 visited를 초기화한다.

queue<pair<int, int>> q;
q.push({ a, 0 });
visited[a] = true;
int a = -1;

bfs를 준비한다.

int a에는 정답을 담을 것이다. bfs에서 답이 나오지 않는다면 -1이 그대로 출력될것이다.

while (!q.empty()) {
    int now = q.front().first;
    int ans = q.front().second;
    q.pop();

q가 차있는동안 반복문을 돌리며 now와 ans를 구하고 pop한다.

ans는 현재 이동한 촌수다.

    if (now == b) {
        a = ans;
        break;
    }

만약 now == b라면 a에 ans를 넣고 반복문을 나온다.

    for (int i = 0; i < v[now].size(); i++) {
        int next = v[now][i];
        if (!visited[next]) {
            q.push({ next, ans + 1 });
            visited[next] = true;
        }
    }
}
cout << a << '\n';

그후 now와 연결되어있으면서 방문하지 않은 곳을 q에 넣어주고 visited처리해주면 된다.

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>

using namespace std;

int n, m; 
int a, b;

bool visited[101];
vector<int> v[101];

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> n;
	cin >> a >> b;
	cin >> m;
	memset(visited, false, sizeof(visited));
	for (int i = 0; i < m; i++) {
		int a, b;
		cin >> a >> b;
		v[a].push_back(b);
		v[b].push_back(a);
	}

	queue<pair<int, int>> q;
	q.push({ a, 0 });
	visited[a] = true;
	int a = -1;
	while (!q.empty()) {
		int now = q.front().first;
		int ans = q.front().second;
		q.pop();
		if (now == b) {
			a = ans;
			break;
		}

		for (int i = 0; i < v[now].size(); i++) {
			int next = v[now][i];
			if (!visited[next]) {
				q.push({ next, ans + 1 });
				visited[next] = true;
			}
		}
	}
	cout << a << '\n';
}

전체코드다.

728x90
반응형
Comments