N개의 노드가 있을 때 N-1개의 노드(a)에서 모두 도달 할 수 있는 노드(b)를 출력하는 문제입니다.
이때 방향그래프의 간선의 방향을 반대로 바꾸면 문제가 간단해집니다.
그래서 간선을 입력받을 때 이렇게 반대로 저장합니다.
for (int i = 0; i < N - 1; i++) {
int u, v;
cin >> u >> v;
f[v - 1][u - 1] = 1; // v -> u
}
이제 N개 노드에 대해서 DFS나 BFS로 모든 노드에 도달 가능한지만 판단하면 끝입니다.
#include <iostream>
using namespace std;
bool vst[100];
int f[100][100];
int N;
int dfs(int u){
int ret = 1;
vst[u] = true;
for (int v = 0; v < N; v++) {
if(!vst[v] && f[u][v])
ret += dfs(v);
}
return ret;
}
int main()
{
cin >> N;
for (int i = 0; i < N - 1; i++) {
int u, v;
cin >> u >> v;
f[v - 1][u - 1] = 1;
}
for (int i = 0; i < N; i++) {
fill(vst, vst + N, false);
if (dfs(i) == N) {
cout << i + 1 << endl;
return 0;
}
}
cout << -1 << endl;
return 0;
}