일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 풀이
- Blockchain
- 프로그래머스
- 문제풀이
- Swift
- dfs
- ReLU
- Stack
- dp
- 그리디
- mysql
- BFS
- Node.js
- Algorithm
- Docker
- 실버쥐
- 부르트포스
- DeepLearning
- 플로이드와샬
- C++
- 백준
- 그래프
- sigmoid
- 캡스톤정리
- 백트래킹
- NeuralNetwork
- ios
- Greedy
- 알고리즘
- 탐색
- Today
- Total
개발아 담하자
[백준/C++] 11725 번 : 트리의 부모 찾기 본문
11725번 : 트리의 부모 찾기
문제 링크 : www.acmicpc.net/problem/11725
11725번: 트리의 부모 찾기
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
www.acmicpc.net
문제
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.
출력
첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.
그래프를 차분히 풀어보면 알 수 있는 문제이다.
참고하면 좋은 비슷한 그래프 문제 : silver-g-0114.tistory.com/20
[백준/C++] 11724번 : 연결 요소의 개수 풀이
문제 11724번 : 연결 요소의 개수 문제 링크 : https://www.acmicpc.net/problem/11724 11724번: 연결 요소의 개수 첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2..
silver-g-0114.tistory.com
처음엔 각 노드의 부모를 정확히 알 수 없으므로 무방향 그래프로 접근한 다음 방문 표시를 통해 부모 노드를 구분했다.
트리의 루트가 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
출력 속도 비교
여러가지 언어와 출력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 총 N개의 줄에 1부터 10,000,000까지의 자연수를 한 줄에 하나씩 출력하는 시간을 측정. 10번 측정해서 평
www.acmicpc.net
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 |