Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- ios
- 그리디
- 문제풀이
- 풀이
- mysql
- sigmoid
- C++
- Blockchain
- Stack
- 플로이드와샬
- 프로그래머스
- BFS
- 탐색
- 캡스톤정리
- Greedy
- Swift
- 백준
- 알고리즘
- 실버쥐
- dfs
- DeepLearning
- dp
- Node.js
- NeuralNetwork
- Docker
- 백트래킹
- ReLU
- Algorithm
- 그래프
- 부르트포스
Archives
- Today
- Total
개발아 담하자
[백준/C++] 11725 번 : 트리의 부모 찾기 본문
11725번 : 트리의 부모 찾기
문제 링크 : www.acmicpc.net/problem/11725
문제
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.
출력
첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.
그래프를 차분히 풀어보면 알 수 있는 문제이다.
참고하면 좋은 비슷한 그래프 문제 : silver-g-0114.tistory.com/20
처음엔 각 노드의 부모를 정확히 알 수 없으므로 무방향 그래프로 접근한 다음 방문 표시를 통해 부모 노드를 구분했다.
트리의 루트가 1이므로 1부터 DFS 탐색을 시작한다.
#include <iostream>
#include <vector>
#define MAX 100000
using namespace std;
int n;
vector<int> graph[MAX];
int ans[MAX]; // 트리의 부모 저장
bool visited[MAX];
void dfs(int node){
visited[node] = true;
for(int i=0; i<graph[node].size(); i++){
int next = graph[node][i];
if(!visited[next]){
ans[next] = node;
dfs(next);
}
}
}
int main(void){
cin >> n;
for(int i=1; i<n; i++){
int node1, node2;
cin >> node1 >> node2;
// 무방향 그래프
graph[node1].push_back(node2);
graph[node2].push_back(node1);
}
dfs(1);
for(int i=2; i<=n; i++){
cout << ans[i] << endl;
}
return 0;
}
간단한 탐색 문제네!! 하고 풀었더니 .. 시간 초과 에러가 났다.
딱히 에러도 없고 푸는 방법도 탐색이 맞는 것 같아 출력 방법에서의 문제일 것 같았다.
출력 속도 참고 자료 : www.acmicpc.net/blog/view/57
ios_base::sync_with_stdio(false);
cout.tie(NULL);
그리고 MAX 범위도 수정했다. (런타임 에러)
#define MAX 100001 // 100000 -> 100001
최종 풀이
#include <iostream>
#include <vector>
#define MAX 100001
using namespace std;
int n;
vector<int> graph[MAX];
int ans[MAX]; // 트리의 부모 저장
bool visited[MAX];
void dfs(int node){
visited[node] = true;
for(int i=0; i<graph[node].size(); i++){
int next = graph[node][i];
if(!visited[next]){
ans[next] = node;
dfs(next);
}
}
}
int main(void){
ios_base::sync_with_stdio(false);
cout.tie(NULL);
cin >> n;
for(int i=1; i<n; i++){
int node1, node2;
cin >> node1 >> node2;
// 무방향 그래프
graph[node1].push_back(node2);
graph[node2].push_back(node1);
}
dfs(1);
for(int i=2; i<=n; i++){
cout << ans[i] << '\n';
}
return 0;
}
입출력 시간 문제, 인덱스 범위에 유의하자!
'👩💻 알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준/C++] 2589 번 : 보물섬 풀이 (0) | 2021.01.18 |
---|---|
[백준/C++] 3055 번 : 탈출 풀이 (0) | 2021.01.17 |
[백준/C++] 2606 번 : 바이러스 풀이 (0) | 2020.08.23 |
[백준/C++] 1182 번 : 부분 수열의 합 (0) | 2020.08.23 |
[백준/C++] 1912 번 : 연속합 (0) | 2020.06.30 |