알고리즘/L11~13 자료구조
13. 트리에서의 거리
쿠쿠트레인
2021. 4. 26. 15:04
문제
트리가 주어지고, 두 노드 X, Y가 주어질 때, 이 두 노드 사이의 거리를 출력하는 프로그램을 작성하시오. 트리에서는 두 노드를 잇는 경로가 유일하기 때문에, 정답은 항상 유일하다는 것을 참고한다. 예를 들어, 다음과 같은 트리에서 노드 3, 노드 6 사이의 거리는 4이다.
입력
첫 번째 줄에 트리의 노드 개수 n, 두 노드 X, Y의 번호가 주어진다. ( 0 ≤ X, Y ≤ n < 1000 ) 두 번째 줄부터 트리의 간선 정보가 주어진다. 각 줄은 2개의 숫자 a, b로 이루어지며, 이는 노드 a가 노드 b의 부모노드라는 것을 의미한다. 루트는 노드 0이라고 가정한다.
출력
두 노드 X, Y 사이의 거리를 출력한다.
예제 입력
11 3 6
0 1
0 2
1 3
1 4
1 5
2 6
2 10
6 7
6 8
6 9
예제 출력
4
#include <stdio.h>
const int MAX = 1005;
int main(){
int parent[MAX] = {0,};
bool color[MAX] = {0,};
int n,x,y;
scanf("%d %d %d",&n,&x,&y);
int tx,ty;
tx = x;
ty = y;
for(int i=0;i<n-1;i++){
int a,b;
scanf("%d %d",&a,&b);
parent[b] = a;
}
int cnt=0;
int stopNum;
if(x==y){
printf("0");
return 0;
}
while(1){
color[x] = true;
//printf("%d %d\n",x,parent[x]);
if(parent[x]==0){
break;
}
x = parent[x];
}
//y색칠
while(1){
if(color[y]==true){
//printf("%d",y);
stopNum = y;
break;
}else{
color[y] = true;
y = parent[y];
}
}
//printf("%d",stopNum);
while(1){
if(tx == stopNum){
break;
}else{
tx = parent[tx];
cnt++;
}
}
while(1){
if(ty == stopNum){
break;
}else{
ty = parent[ty];
cnt++;
}
}
printf("%d",cnt);
}