<백준> 18352

진기명기·2026년 3월 15일

코딩테스트<C++>

목록 보기
176/212

특정 거리의 도시 찾기

문제

입력
첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개의 자연수 A, B가 공백을 기준으로 구분되어 주어진다. 이는 A번 도시에서 B번 도시로 이동하는 단방향 도로가 존재한다는 의미다. (1 ≤ A, B ≤ N) 단, A와 B는 서로 다른 자연수이다.

출력
X로부터 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 K인 모든 도시의 번호를 한 줄에 하나씩 오름차순으로 출력한다.
이 때 도달할 수 있는 도시 중에서, 최단 거리가 K인 도시가 하나도 존재하지 않으면 -1을 출력한다.

vector<vector<int>> v;
vector<int> answer;
vector<int> visited;

void BFS(int node)
{
	queue<int> q;
	q.push(node);
	visited[node]++;

	while (!q.empty())
	{
		int front = q.front();
		q.pop();
		for (int i : v[front])
		{
			if (visited[i] == -1)
			{
				visited[i] = visited[front] + 1;
				q.push(i);
			}
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m, k, x;
	cin >> n >> m >> k >> x;

	v.resize(n + 1);

	for (int i = 0; i < m; i++)
	{
		int s, e;
		cin >> s >> e;
		v[s].push_back(e);
	}


	visited.resize(n + 1, -1);

	BFS(x);

	for (int i = 0; i <= n; i++)
	{
		if (visited[i] == k)
			answer.push_back(i);
	}

	if (answer.empty())
		cout << -1;
	else
	{
		sort(answer.begin(), answer.end());
		for (int i : answer)
		{
			cout << i<<"\n";
		}
	}
}

0개의 댓글