문제링크: https://www.acmicpc.net/problem/1325
1325번: 효율적인 해킹
첫째 줄에, N과 M이 들어온다. N은 10,000보다 작거나 같은 자연수, M은 100,000보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에 신뢰하는 관계가 A B와 같은 형식으로 들어오며, "A가 B를 신뢰한다"를 의미한다. 컴퓨터는 1번부터 N번까지 번호가 하나씩 매겨져 있다.
www.acmicpc.net
전형적인 DFS문제 어렵지 않다.
사실 정답률 보고, 얼마나 오래 걸릴까 걱정했는데 1시간? 30분? 이렇게 푼 것 같다.
그러나 문제를 착각할 수가 있다.
A가 B를 신뢰한다 == 서로가 서로를 신뢰하다고 보면 안된다.
그래서 벡터에 넣어놓고 보면 방향성이 있는 그래프로 확인할 수 있다.
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v[10001];
bool bVisited[10001];
int nHackingCount[10001] = { 0, };
int N, M;
void DFS(int nStart)
{
nHackingCount[nStart]++;
for (int i = 0; i < v[nStart].size(); i++)
{
int nNextStart = v[nStart][i];
if (false == bVisited[nNextStart])
{
bVisited[nNextStart] = true;
DFS(nNextStart);
}
}
}
int main(void)
{
cin >> N >> M;
int nComputer1, nComputer2;
for (int i = 0; i < M; i++)
{
cin >> nComputer1 >> nComputer2;
v[nComputer1].push_back(nComputer2);
}
for (int i = 1; i <= N; i++)
{
memset(bVisited, false, sizeof(bVisited));
bVisited[i] = true;
DFS(i);
}
int nTempMax = 0;
for (int i = 1; i <= N; i++)
{
nTempMax = max(nTempMax, nHackingCount[i]);
}
for (int i = 1; i <= N; i++)
{
if (nTempMax == nHackingCount[i])
{
printf("%d ",i);
}
}
cout << endl;
return 0;
}
'개발 > 백준' 카테고리의 다른 글
백준 10451번: 순열 사이클 (0) | 2019.09.26 |
---|---|
백준 9466번: 텀 프로젝트 (0) | 2019.09.26 |
백준 1963번: 소수 경로 (0) | 2019.09.02 |
백준 1389번: 케빈 베이컨의 6단계 법칙 (0) | 2019.09.01 |
백준 11724번: 연결 요소의 개수 (0) | 2019.08.29 |