인프런 커뮤니티 질문&답변
2-S DFS 시간초과
해결된 질문
작성
·
312
0
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
vector<int> adjList[10002];
bool visited[10002];
int n, m;
int _max = INT_MIN;
map<int, int> virus;
void fastIO() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
void DFS(int v, int sum, int com) {
_max = max(_max, sum);
virus[com] = max(virus[com], sum);
for (auto adjV : adjList[v]) {
visited[adjV] = 1;
DFS(adjV, sum + 1, com);
visited[adjV] = 0;
}
}
int main() {
fastIO();
//freopen("input.txt", "rt", stdin);
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
adjList[b].push_back(a);
}
for (int i = 1; i <= 10000; i++) {
if (adjList[i].empty()) continue;
visited[i] = 1;
DFS(i, 1, i);
visited[i] = 0;
}
for (auto e : virus) {
if (e.second == _max) {
cout << e.first << ' ';
}
}
return EXIT_SUCCESS;
}
인접리스트 DFS로 풀었는데 시간 초과가 납니다.
뭐가 문제일까요..?
답변 1
1
큰돌
지식공유자
안녕하세요. 찬비님
1. DFS가 아니라 완전탐색으로 푸셨으니까 시간초과가 나는 겁니다.
visited[adjV] = 1;
DFS(adjV, sum + 1, com);
visited[adjV] = 0;
이부분을 보죠. DFS는 뭐죠?
"방문한 정점은 다시 방문하지 않는, 깊이 우선탐색"이죠?
근데 저렇게 해버리면 adjV 노드를 탐색했다가 방문을 한처리를 지우고 다시 탐색하게 될 겁니다.
이건 나중에 배우는 완전탐색꼴이에요.
2. 이 문제의 N을 기반으로 DFS로 시간복잡도가 얼마일까요?
시간복잡도를 계산해보시면 1억입니다. 이부분에 관한건 영상에 있습니다.
또 질문사항있으시면 언제든 말씀 부탁드립니다.
감사합니다.
강사 큰돌 올림.






아.. 저렇게 짜면 완탐이었군요. 개념 강의 다시들어야겠습니다. 감사합니다.