문제 풀이/C#
[18352] - 특정 거리의 도시 찾기
Chamber
2022. 11. 14. 22:29
https://www.acmicpc.net/problem/18352
18352번: 특정 거리의 도시 찾기
첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개
www.acmicpc.net
문제는 쉬운데 오타를 발견 못해 오래걸린 문제..
문제 풀이
- 그래프 생성
- 입력받은 단방향 도로를 그래프에 넣기
- 현재 도시가 몇번만에 찾아졌는지 알기위한 번호 배열point_num 생성
- 큐에 시작 도시 삽입, 시작 도시 번호 1
- BFS를 돌며 아직 찾아지지 않았으면(0이면) 큐에 그 도시 넣고, 이전 도시의 번호 +1 해주기
- 도시번호 1번부터 n번까지 돌며 stringbuilder에 번호가 같은 도시 추가
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Baekjoon.Practice
{
class _18352
{
static void Main(string[] args)
{
StringBuilder stb = new StringBuilder();
//n[0] - 노드 개수, n[1] - 선 개수, n[2] - K, n[3] - 시작
int[] n = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
Dictionary<int, List<int>> graph = new Dictionary<int, List<int>>();
for (int i = 1; i <= n[0]; i++)
graph[i] = new List<int>();
for (int i = 0; i < n[1]; i++)
{
int[] arr = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
graph[arr[0]].Add(arr[1]);
}
int[] point_num = new int[n[0] + 1];
Queue<int> q = new Queue<int>();
point_num[n[3]] = 1;
q.Enqueue(n[3]);
while (q.Count > 0)
{
int point = q.Dequeue();
foreach (int i in graph[point])
{
if (point_num[i] == 0)
{
point_num[i] = point_num[point] + 1;
q.Enqueue(i);
}
}
}
bool flag = false;
for (int i = 1; i <= n[0]; i++)
{
if (point_num[i]-1 == n[2])
{
stb.AppendLine(i.ToString());
flag = true;
}
}
if (flag)
Console.WriteLine(stb);
else
Console.WriteLine(-1);
}
}
}