루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.
출력
첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.
예제 입력 1
7 1 6 6 3 3 5 4 1 2 4 4 7 |
예제 출력 1
4 6 1 3 1 4 |
예제 입력 2
12 1 2 1 3 2 4 3 5 3 6 4 7 4 8 5 9 5 10 6 11 6 12 |
예제 출력 2
1 1 2 3 3 4 4 5 5 6 6 |
더보기
Solution
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int N, **connected=NULL, *connected_count=NULL, **tree=NULL, *queue=NULL, *parent=NULL, front=0, rear=0;
scanf("%d", &N);
connected=(int **)malloc((N-1)*sizeof(int *));
for(int n=0;n<N-1;n++)
connected[n]=(int *)malloc(2*sizeof(int));
connected_count=(int *)calloc(N+1,sizeof(int));
parent=(int *)calloc(N+1,sizeof(int));
tree=(int **)malloc((N+1)*sizeof(int *));
queue=(int *)malloc(N*sizeof(int));
for(int i=0;i<N-1;i++)
{
scanf("%d%d", &connected[i][0], &connected[i][1]);
if(connected[i][0]==1)
{
parent[connected[i][1]]=1;
queue[rear++]=connected[i][1];
}
else if(connected[i][1]==1)
{
parent[connected[i][0]]=1;
queue[rear++]=connected[i][0];
}
else
{
connected_count[connected[i][0]]++;
connected_count[connected[i][1]]++;
}
}
for(int i=1;i<=N;i++)
tree[i]=(int *)calloc(connected_count[i],sizeof(int));
for(int i=0;i<=N;i++)
connected_count[i]=0;
for(int i=0;i<N-1;i++)
{
if(connected[i][0]!=1 && connected[i][1]!=1)
{
tree[connected[i][0]][connected_count[connected[i][0]]++]=connected[i][1];
tree[connected[i][1]][connected_count[connected[i][1]]++]=connected[i][0];
}
}
while(front<rear)
{
for(int i=0;i<connected_count[queue[front]];i++)
if(parent[tree[queue[front]][i]]==0)
{
parent[tree[queue[front]][i]]=queue[front];
queue[rear++]=tree[queue[front]][i];
}
front++;
}
for(int i=2;i<=N;i++)
printf("%d\n", parent[i]);
for(int i=1;i<=N;i++)
free(tree[i]);
free(tree);
free(queue);
free(parent);
free(connected_count);
for(int n=0;n<N-1;n++)
free(connected[n]);
free(connected);
return 0;
}
728x90
'백준 알고리즘' 카테고리의 다른 글
<백준 알고리즘> 2023번: 신기한 소수 (0) | 2023.02.10 |
---|---|
<백준 알고리즘> 2961번: 도영이가 만든 맛있는 음식 (0) | 2023.02.09 |
<백준 알고리즘> 12865번: 평범한 배낭 (0) | 2023.02.09 |
<백준 알고리즘> 16953번: A → B (0) | 2023.02.08 |
<백준 알고리즘> 17298번: 오큰수 (0) | 2023.02.08 |