Algorithm/λ¬Έμ œν’€μ΄

[λ°±μ€€] 18352번 - νŠΉμ • 거리의 λ„μ‹œ μ°ΎκΈ° (C++)

moaoh 2023. 8. 30. 00:18

 

1543번: λ¬Έμ„œ 검색

μ„Έμ€€μ΄λŠ” μ˜μ–΄λ‘œλ§Œ 이루어진 μ–΄λ–€ λ¬Έμ„œλ₯Ό κ²€μƒ‰ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“€λ €κ³  ν•œλ‹€. 이 ν•¨μˆ˜λŠ” μ–΄λ–€ 단어가 총 λͺ‡ 번 λ“±μž₯ν•˜λŠ”μ§€ μ„Έλ €κ³  ν•œλ‹€. κ·ΈλŸ¬λ‚˜, μ„Έμ€€μ΄μ˜ ν•¨μˆ˜λŠ” μ€‘λ³΅λ˜μ–΄ μ„ΈλŠ” 것은 λΉΌκ³  μ„Έμ•Ό ν•œ

www.acmicpc.net

문제

 

μ–΄λ–€ λ‚˜λΌμ—λŠ” 1λ²ˆλΆ€ν„° Nλ²ˆκΉŒμ§€μ˜ λ„μ‹œμ™€ M개의 단방ν–₯ λ„λ‘œκ°€ μ‘΄μž¬ν•œλ‹€. λͺ¨λ“  λ„λ‘œμ˜ κ±°λ¦¬λŠ” 1이닀.

이 λ•Œ νŠΉμ •ν•œ λ„μ‹œ Xλ‘œλΆ€ν„° μΆœλ°œν•˜μ—¬ 도달할 수 μžˆλŠ” λͺ¨λ“  λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 μ •ν™•νžˆ K인 λͺ¨λ“  λ„μ‹œλ“€μ˜ 번호λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. λ˜ν•œ 좜발 λ„μ‹œ Xμ—μ„œ 좜발 λ„μ‹œ X둜 κ°€λŠ” μ΅œλ‹¨ κ±°λ¦¬λŠ” ν•­μƒ 0이라고 κ°€μ •ν•œλ‹€.

예λ₯Ό λ“€μ–΄ N=4, K=2, X=1일 λ•Œ λ‹€μŒκ³Ό 같이 κ·Έλž˜ν”„κ°€ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€κ³  κ°€μ •ν•˜μž.

이 λ•Œ 1번 λ„μ‹œμ—μ„œ μΆœλ°œν•˜μ—¬ 도달할 수 μžˆλŠ” λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 2인 λ„μ‹œλŠ” 4번 λ„μ‹œ 뿐이닀.  2번과 3번 λ„μ‹œμ˜ 경우, μ΅œλ‹¨ 거리가 1이기 λ•Œλ¬Έμ— 좜λ ₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

μž…λ ₯

첫째 쀄에 λ„μ‹œμ˜ 개수 N, λ„λ‘œμ˜ 개수 M, 거리 정보 K, 좜발 λ„μ‹œμ˜ 번호 Xκ°€ μ£Όμ–΄μ§„λ‹€. (2 ≀ β‰€ 300,000, 1 ≀ β‰€ 1,000,000, 1 ≀ β‰€ 300,000, 1 ≀ β‰€ N) λ‘˜μ§Έ 쀄뢀터 M개의 쀄에 κ±Έμ³μ„œ 두 개의 μžμ—°μˆ˜ A, Bκ°€ 곡백을 κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„λ˜μ–΄ μ£Όμ–΄μ§„λ‹€. μ΄λŠ” A번 λ„μ‹œμ—μ„œ B번 λ„μ‹œλ‘œ μ΄λ™ν•˜λŠ” 단방ν–₯ λ„λ‘œκ°€ μ‘΄μž¬ν•œλ‹€λŠ” μ˜λ―Έλ‹€. (1 ≀ A, β‰€ N) 단, A와 BλŠ” μ„œλ‘œ λ‹€λ₯Έ μžμ—°μˆ˜μ΄λ‹€.

 

 

좜λ ₯

Xλ‘œλΆ€ν„° μΆœλ°œν•˜μ—¬ 도달할 수 μžˆλŠ” λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 K인 λͺ¨λ“  λ„μ‹œμ˜ 번호λ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 좜λ ₯ν•œλ‹€.

이 λ•Œ 도달할 수 μžˆλŠ” λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 K인 λ„μ‹œκ°€ ν•˜λ‚˜λ„ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ -1을 좜λ ₯ν•œλ‹€.

 

 

풀이과정

문제λ₯Ό 처음 λ΄€μ„λ•Œ bfs둜 μ ‘κ·Όν•΄μ•Όκ² λ‹€λΌλŠ” 생각이 μš°μ„ μ μœΌλ‘œ λ“€μ–΄μ„œ bfs둜 μ ‘κ·Όν•˜μ—¬ ν’€μ–΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

 

 

code

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

std::vector <int> v[300001];
int visited[300001];

void	bfs(int k, int x)
{
	int	temp, count = 0, Qsize;
	std::queue <int> que;
	std::priority_queue <int, std::vector<int>, std::greater<int> > answer;

	que.push(x);
	visited[x] = 1;
	while (!que.empty())
	{
		Qsize = que.size();
		count++;
		for (int i = 0; i < Qsize; i++) {
			temp = que.front();
			que.pop();
			for (int j = 0; j < v[temp].size(); j++) {
				if (!visited[v[temp][j]]) {
					if (count == k) answer.push(v[temp][j]);
					else que.push(v[temp][j]);
					visited[v[temp][j]] = true;
				}
			}
		}
	}
	
	if (answer.size() == 0) std::cout << "-1" << "\n";
	else {
		while(!answer.empty()) {
			std::cout << answer.top() << "\n";
			answer.pop();
		}
	}
}

int		main(void)
{
	int n, m, k, x, a, b;

	std::cin >> n >> m >> k >> x;
	for(int i = 0; i < m; i++) {
		std::cin >> a >> b;
		v[a].push_back(b);
	}
	if (k == 0) std::cout << x << "\n";
	else bfs(k, x);

	return (0);
}

 

ν›„κΈ°

μ΄μƒν•œ κ³³μ—μ„œ λ»˜μ§“μ„ ν•΄μ„œ μ‹œκ°„μ΄ λ„ˆλ¬΄ 많이 μ†ŒλΉ„ν•œ κ±° κ°™μ•„μ„œ μ•„μ‰½λ‹€λΌλŠ” 생각이 λ“€μ—ˆλ‹€.