루트 없는 트리가 주어진다. 이때, 트리의 루트를 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

+ Recent posts