전역변수를 최대한 덜 사용해 보았다. 문제를 제대로 안 읽어서 틀린 시도가 있었고, 방문표시를 덜 해서 틀린 시도가 존재했다. 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;
}