https://www.acmicpc.net/problem/11725
11725번: 트리의 부모 찾기
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
www.acmicpc.net
시간초과가 계속 났던 문제.
cin, cout을 scanf, printf로도 바꿔 보고
별걸 다 해봤지만 안됐던 이유는..
값을 구할 때
for(int i=2; i<= N; i++)
{
bfs(i);
}
이런 식으로 bfs를 매번 반복하려 했기 때문이었다
쓸데없이 bfs를 반복하고 이거때문에 visited(방문 여부 확인을 위한 부울 변수)도 계속 false로 초기화를 해야 했다.
for(int i=0; i<graph[temp].size(); i++){
if(visited[graph[temp][i]]== false){
visited[temp] = true;
q.push(graph[temp][i]);
//printf("%d %d\n",temp, graph[temp][i]);
result[graph[temp][i]] = temp;
}
그래서 부모 트리를 저장할 수 있는 result[100001] 배열을 만들어 주고, 해당하는 인덱스 값에 부모노드의 값을 넣었다.
temp가 현재 해당하는 노드이고, if문 내의 graph[temp][i]] 는 그의 자식노드이니까 반대로 넣어주면 된다!
전체 코드
#include <stdio.h>
#include <vector>
#include <queue>
#include <memory.h>
#define MAX 100001
using namespace std;
vector<int> graph[MAX];
int result[MAX];
void bfs(int start){
int visited[MAX];
memset(visited, false, sizeof(visited));
queue<int> q;
q.push(start);
visited[start]=true;
while(!q.empty()){
int temp = q.front();
q.pop();
for(int i=0; i<graph[temp].size(); i++){
if(visited[graph[temp][i]]== false){
visited[temp] = true;
q.push(graph[temp][i]);
//printf("%d %d\n",temp, graph[temp][i]);
result[graph[temp][i]] = temp;
}
}
}
}
int main(){
int N;
scanf("%d",&N);
int u, v;
for(int i=0 ; i<N-1; i++){
scanf("%d %d",&u, &v);
graph[u].push_back(v);
graph[v].push_back(u);
}
bfs(1);
for(int i=2; i<= N; i++)
{
printf("%d\n",result[i]);
}
/*for(int i=2; i<= N; i++)
{
bfs(i);
}*/
return 0;
}
'Coding > 코딩테스트' 카테고리의 다른 글
#2644 촌수계산 (0) | 2022.05.09 |
---|---|
백준 #7662(프로그래머스 #42628) 땅따먹기 (0) | 2022.04.11 |
백준 solved.ac 사용기 (0) | 2021.11.08 |
#12913 땅따먹기 (0) | 2021.10.03 |
프로그래머스 level1 클리어! (0) | 2021.08.28 |