백준 알고리즘 1325번 - 효율적인 해킹
2019. 7. 17. 17:45ㆍ프로그래밍/백준 알고리즘
dfs로 푸는 문제
노드를 하나씩 돌면서, 각각의 노드가 갈 수 있는 최대 횟수를 벡터에 저장한다.
처음에는 배열로 만들었지만, 최대 크기가 10000*10000이나 되서, 연결 여부를 배열로 만들면 시간 초과가 나온다.
또, 방문 여부를 판단하는 배열을 한 번씩 돌 때마다 초기화 시켜주어야 한다. 처음에는 초기화 시켜주지 않았지만, 최대길이가 짧은 노드부터 방문하게 된다면 최대 방문 순위를 재대로 셀 수 없게 된다.
풀이 과정
1. vector 배열을 만들어, from을 index로, to를 vector 배열에 push 한다.
2. 연결된 두 쌍을 찾아, dfs를 돌린다. 그 후 진행하는 횟수를 arr배열에 저장한다.
3. 오름차순 정렬이므로, arr배열에서 max값을 찾아 그와 동일한 값을 갖는 배열값을 1부터 배열 크기만큼 돌린다. 자동으로 정렬이 이뤄짐을 알 수 있다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n,m;
vector<int> graph[10001];
vector<int> visited;
vector<int> counts;
int ans=0;
void dfs(int node){
counts[node]++;
ans=max(ans,counts[node]);
int big=graph[node].size();
for(int i=0;i<big;i++){
int next=graph[node][i];
if(!visited[next]){
visited[next]=true;
dfs(next);
}
}
}
int main(){
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
int s,e;
scanf("%d %d",&s,&e);
graph[s].push_back(e);
}
counts=vector<int> (n+1,0);
for(int i=1;i<=n;i++){
visited=vector<int> (n+1,0); //방문 초기화
visited[i]=true;
dfs(i);
}
for(int i=1;i<=n;i++){
if(counts[i]==ans){
printf("%d ",i);
}
}
return 0;
}
'프로그래밍 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 풀이 1780번 - 종이의 개수 (0) | 2019.09.05 |
---|---|
백준 알고리즘 문제 풀이 10610번 - 30 (0) | 2019.09.05 |
백준 알고리즘 2644번 - 촌수계산 (0) | 2019.07.09 |
백준 알고리즘 1783번 - 병든 나이트 (0) | 2019.06.11 |
백준 알고리즘 1744번 - 수 묶기 (0) | 2019.06.11 |