https://www.acmicpc.net/problem/1325
문제
해커 김지민은 잘 알려진 어느 회사를 해킹하려고 한다. 이 회사는 N개의 컴퓨터로 이루어져 있다. 김지민은 귀찮기 때문에, 한 번의 해킹으로 여러 개의 컴퓨터를 해킹 할 수 있는 컴퓨터를 해킹하려고 한다.
이 회사의 컴퓨터는 신뢰하는 관계와, 신뢰하지 않는 관계로 이루어져 있는데, A가 B를 신뢰하는 경우에는 B를 해킹하면, A도 해킹할 수 있다는 소리다.
이 회사의 컴퓨터의 신뢰하는 관계가 주어졌을 때, 한 번에 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터의 번호를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에, N과 M이 들어온다. N은 10,000보다 작거나 같은 자연수, M은 100,000보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에 신뢰하는 관계가 A B와 같은 형식으로 들어오며, "A가 B를 신뢰한다"를 의미한다. 컴퓨터는 1번부터 N번까지 번호가 하나씩 매겨져 있다.
출력
첫째 줄에, 김지민이 한 번에 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터의 번호를 오름차순으로 출력한다.
문제 풀이
그래프 탐색 문제.
A가 B를 신뢰할 때, B를 해킹하면 A도 해킹할 수 있다. 이를 이용해 각 컴퓨터를 신뢰하는 컴퓨터들을 벡터 배열에 저장한다.
이후 모든 컴퓨터에 대해 각 컴퓨터를 시작으로 해킹한다고 가정하고, 일반적인 그래프 탐색 문제처럼 bfs나 dfs를 수행하여 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터들을 찾는다.
아래는 코드.
더보기
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
queue<int> bfsQueue;
queue<int> answerQueue;
vector<int>* arr;
bool* isVisited;
int maxNum = 0;
int N, M, A, B;
int bfs(int start)
{
int count = 0;
bfsQueue.push(start);
isVisited[start] = true;
while (!bfsQueue.empty())
{
int current = bfsQueue.front();
count++;
for (int i = 0; i < arr[current].size(); i++)
{
int nextTarget = arr[current].at(i);
if (isVisited[nextTarget] == false)
{
isVisited[nextTarget] = true;
bfsQueue.push(nextTarget);
}
}
bfsQueue.pop();
}
return count;
}
void reset()
{
for (int i = 0; i < N; i++)
{
isVisited[i] = false;
}
}
int main()
{
cin.tie(NULL);
ios::sync_with_stdio(false);
cin >> N >> M;
arr = new vector<int>[N];
isVisited = new bool[N];
for (int i = 0; i < N; i++)
{
isVisited[i] = false;
}
for (int i = 0; i < M; i++)
{
cin >> A >> B;
arr[B - 1].push_back(A - 1);
}
for (int i = 0; i < N; i++)
{
int currentNum = bfs(i);
if (currentNum > maxNum)
{
maxNum = currentNum;
while (!answerQueue.empty())
{
answerQueue.pop();
}
answerQueue.push(i);
}
else if (currentNum == maxNum)
{
answerQueue.push(i);
}
reset();
}
while (!answerQueue.empty())
{
cout << answerQueue.front() + 1 << " ";
answerQueue.pop();
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준 4949] 균형잡힌 세상 (C++) (0) | 2024.08.06 |
---|---|
[백준 2231] 분해합 (C++) (0) | 2024.08.05 |
[백준 14921] 용액 합성하기 (C++) (0) | 2024.08.03 |
[백준 2688] 줄어들지 않아 (C++) (0) | 2024.08.02 |
[백준 14003] 가장 긴 증가하는 부분 수열5 (C++) (0) | 2024.08.01 |