알고리즘 문제분석
[DFS] 백준 1325 효율적인 해킹
danny0628
2021. 2. 18. 11:13
1325번: 효율적인 해킹
첫째 줄에, N과 M이 들어온다. N은 10,000보다 작거나 같은 자연수, M은 100,000보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에 신뢰하는 관계가 A B와 같은 형식으로 들어오며, "A가 B를 신뢰한
www.acmicpc.net
수행기간 : 2시간
실버 1의 난이도의 1325문제였다. 처음에 bfs를 통해 문제해결을 하려다가 생각하기에 더 복잡할 것 같아서 바로 dfs로 선회하여 문제를 해결하였다. 처음에 메모리 초과가 떴었는데, 그 이유는 map배열을 10000X10000으로 선언을 하다보니 메모리에서 에러가 떴었던 것 같다. 인접행렬을 이용한 문제풀이를 위주로 하다보니 인접 리스트로 접근하기가 쉽지 않았다. 그래도 구글링과 친구들의 도움을 받아 인접 리스트를 익히고 vector로 solving 결과 다행히 무난한 시간 3.5s 와 메모리를 사용하여 구현하였다.
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
int n, m;
bool visit[10001];
vector <int> map[10001];
int cnt[10001];
int ans = 0;
int maximum;
void dfs(int v) {
ans++;
visit[v] = true;
for (int i = 0; i < map[v].size();i++) {
int nv = map[v][i];
if (!visit[nv]) {
dfs(nv);
}
}
}
void init() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
}
int main() {
init();
cin >> n >> m;
int a, b;
for (int i = 0;i < m;i++) {
cin >> a >> b;
map[b].push_back(a);
}
for (int i = 1; i <= n;i++) {
ans = 0;
memset(visit, 0, sizeof(visit)); //이걸 빼먹엇엇음,,,,
dfs(i);
cnt[i] = ans;
if (maximum < ans) {
maximum = ans;
}
}
for (int i = 1;i <= n;i++) {
if (cnt[i] == maximum) {
cout << i << " ";
}
}
}
++ 조만간 문제풀면서 익힌 인접리스트 dfs&bfs 글을 정리하여 쓸 생각이다.