비상연락망과 연락을 시작하는 당번에 대한 정보가 주어질 때, 가장 나중에 연락을 받게 되는 사람 중 번호가 가장 큰 사람을 구하는 함수를 작성하시오.
[예시]
아래는 비상연락망을 나타낸 그림이다.
각 원은 개개인을 의미하며, 원 안의 숫자는 그사람의 번호를 나타내고 빨간원은 연락을 시작하는 당번을 의미한다.
화살표는 연락이 가능한 방향을 의미한다.
위의 예시에서는 7번과 1번은 서로 연락이 가능하다,
하지만 2번과 7번의 경우 2번은 7번에게 연락할 수 있지만 7번은 2번에게 연락할 수 없다.
비상연락망이 가동되면 아래 그림과 같이 연락을 시작하는 당번인 2번은 연락 가능한 7번과 15번에 동시에 연락을 취한다 (다자 간 통화를 사용한다고 가정).
그 다음 아래와 같이 7번은 1번에게, 15번은 4번에게 연락을 취한다 (이 과정은 동시에 일어난다고 가정한다).
그 다음 아래와 같이 1번은 8번과 17번에게 동시에 연락하며, 이와 동시에 4번은 10번에게 연락한다.
7번과 2번의 경우는 이미 연락을 받은 상태이기 때문에 다시 연락하지 않는다.
위의 모습이 연락이 끝난 마지막 모습이 되며, 마지막에 동시에 연락 받은 사람은 8번, 10번, 17번의 세 명이다.
이 중에서 가장 숫자가 큰 사람은 17번이므로 17을 반환하면 된다.
BFS를 이용하여 아직 방문하지 않은 노드에 방문할 때마다 depth를 1씩 증가시켜 현재 그 노드의 깊이를 저장하고 모든 탐색을 마친 후 가장 depth가 높은 값의 인덱스를 저장하여 출력한다.
(조금 더 간단하게 생각하면 빠르게 풀 수 있었을텐데 문제를 복잡하게 생각해서 푸는데 오래걸렸다.)
#include<iostream>
#include <vector>
#include <queue>
using namespace std;
#define MAX 101
vector<int>arr[MAX];
int depth[MAX];
void bfs(int start_p) {
queue<int>q;
q.push(start_p);
depth[start_p] = 1;
while (!q.empty()) {
int cur_from = q.front();
q.pop();
for (int i = 0; i < arr[cur_from].size(); i++) {
int cur_next = arr[cur_from][i];
if (depth[cur_next] == 0) {
depth[cur_next] = depth[cur_from] + 1;
q.push(cur_next);
}
}
}
}
int main(int argc, char** argv)
{
int test_case;
int T=10;
for (test_case = 1; test_case <= T; ++test_case)
{
int n, start;
cin >> n >> start;
for (int i = 1; i < MAX; i++) {
arr[i].clear();
depth[i] = 0;
}
for (int i = 0; i < n / 2; i++) {
int from, to;
cin >> from >> to;
arr[from].push_back(to);
}
bfs(start);
int answer = start;
for (int i = 1; i < MAX; i++) {
if (depth[i] >= depth[answer])answer = i;
}
cout << "#" << test_case << " " << answer << "\n";
}
return 0;
}