백준 18352 c++

magicdrill·2024년 5월 4일
0

백준 문제풀이

목록 보기
340/654

백준 18352 c++

전역변수를 최대한 덜 사용해 보았다. 문제를 제대로 안 읽어서 틀린 시도가 있었고, 방문표시를 덜 해서 틀린 시도가 존재했다. BFS함수의 결과를 vector로 반환해보려 시도했는데 그럴 경우 복사로 인해 메모리가 2배가 되기 때문에 vector를 참조하는 식으로 바꾸었다.

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

using namespace std;

void input_city(int *N, int* M, int* K, int* X, vector<vector<int>> &city)
{
	int i;
	int A, B;

	cin >> *N >> *M >> *K >> *X;
	city.resize(*N + 1);
	for (i = 0; i < *M; i++)
	{
		cin >> A >> B;
		city[A].push_back(B);
	}

	/*
	for (i = 0; i < city.size(); i++)
	{
		cout << i << " : ";
		for (int j = 0; j < city[i].size(); j++)
		{
			cout << city[i][j] << " ";
		}
		cout << "\n";
	}
	*/

	return;
}

void BFS(int K, int X, vector<vector<int>>& city, vector<int> &answer)
{
	int current, next;
	int i, distance = 0, num_of_city = city.size();
	queue <pair<int, int>> q;
	vector <bool> visited(num_of_city, false);

	q.push({X, distance});
	visited[X] = true;
	while (!q.empty())
	{
		current = q.front().first;
		distance = q.front().second;
		q.pop();
		for (i = 0; i < city[current].size(); i++)
		{
			next = city[current][i];
			if (visited[next] == false)
			{
				if ((distance + 1) == K)
				{
					visited[next] = true;// 정답을 추가하는 위치에서도 방문체크를 해야 함.
					//안그러면 동일 도시가 여러번 저장됨
					answer.push_back(next);
				}
				else
				{
					visited[next] = true;
					q.push({ next, distance + 1 });
				}
			}
		}
	}

	return;
}

void find_answer(int K, int X, vector<vector<int>>& city)
{
	vector<int> answer;

	//최단거리 문제니까 BFS?
	BFS(K, X, city, answer);
	if (answer.empty())
	{
		cout << "-1";
	}
	else
	{
		//오름차순으로 출력한다.
		sort(answer.begin(), answer.end());
		for (int ans : answer)
		{
			cout << ans << "\n";
		}
	}

	return;
}

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

	int N, M, K, X;
	vector<vector<int>> city;

	input_city(&N, &M, &K, &X, city);
	find_answer(K, X, city);

	return 0;
}

0개의 댓글