728x90
반응형
- 문제
해커 김지민은 잘 알려진 어느 회사를 해킹하려고 한다. 이 회사는 N개의 컴퓨터로 이루어져 있다. 김지민은 귀찮기 때문에, 한 번의 해킹으로 여러 개의 컴퓨터를 해킹 할 수 있는 컴퓨터를 해킹하려고 한다.
이 회사의 컴퓨터는 신뢰하는 관계와, 신뢰하지 않는 관계로 이루어져 있는데, A가 B를 신뢰하는 경우에는 B를 해킹하면, A도 해킹할 수 있다는 소리다.
이 회사의 컴퓨터의 신뢰하는 관계가 주어졌을 때, 한 번에 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터의 번호를 출력하는 프로그램을 작성하시오.
- 입력
첫째 줄에, N과 M이 들어온다. N은 10,000보다 작거나 같은 자연수, M은 100,000보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에 신뢰하는 관계가 A B와 같은 형식으로 들어오며, "A가 B를 신뢰한다"를 의미한다. 컴퓨터는 1번부터 N번까지 번호가 하나씩 매겨져 있다.
- 출력
첫째 줄에, 김지민이 한 번에 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터의 번호를 오름차순으로 출력한다.
- 예제 입력
5 4
3 1
3 2
4 3
5 3
- 예제 출력
1 2
- 접근방식
인접 리스트를 기반으로 dfs 탐색, int형 dfs를 사용하여 반환
- 코드
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <string.h>
using namespace std;
int n, m, a, b, mx;
int _save[10001], visited[10001];
vector<int> v[10001];
int dfs(int here)
{
visited[here] = 1;
int ret = 1;
for (int there : v[here])
{
if (visited[there])
continue;
ret += dfs(there); // 결과값을 계속 모아서 반환
}
return ret;
}
int main()
{
cin >> n >> m;
while(m--)
{
cin >> a >> b;
v[b].push_back(a); // 인접 리스트에 값 넣기
}
for (int i = 1; i <= n; i++)
{
memset(visited, 0, sizeof(visited));
_save[i] = dfs(i); // i로 부터 몇개를 탐색할 수 있는지
mx = max(_save[i], mx); // 가장 큰 값 구하기
}
for (int i = 1; i <= n; i++)
if (mx == _save[i])
cout << i << " ";
return 0;
}
728x90
반응형
'C++ > BOJ' 카테고리의 다른 글
[C++]/백준 2589번 보물섬 (0) | 2024.02.20 |
---|---|
[C++]/백준 17298번 오큰수 (0) | 2023.01.20 |
[C++]/백준 2636번 치즈 (0) | 2023.01.20 |
[C++]/백준 14502번 연구소 (1) | 2023.01.20 |
[C++]/백준 4949번 균형잡힌 세상 (0) | 2023.01.19 |