데이터 구조Search
불쌍 한 비비 가 집에 돌아 오 자마자 자신의 휴대 전 화 를 잃 어 버 린 것 을 발견 하고 뒤 돌아 서서 자신의 휴대 전 화 를 검색 하기 로 했다.지금 우 리 는 비비 의 집 이 이 진 트 리 의 뿌리 에 있다 고 가정 한다.비비 의 마음 속 에 모든 노드 에 하나의 가중치 x 가 있 는데 그의 마음 속 에서 이 노드 로 가면 자신의 핸드폰 을 찾 을 수 있 을 것 이 라 고 예감 하 는 정 도 를 나타 낸다 (그의 예감 은 전혀 정확 하지 않 지만).비비 가 한 노드 에 도 착 했 을 때 이 노드 에 검색 하지 않 은 아들 노드 가 있 으 면 비비 가 검색 하지 않 은 아들 노드 로 가서 검색 을 하고 그렇지 않 으 면 아버지 노드 로 돌아간다.만약 에 특정한 노드 가 검색 되 지 않 은 두 개의 아들 노드 를 가지 고 있다 면 비 비 는 가중치 가 큰 아들 노드 를 먼저 검색 할 것 이다.만약 에 비비 가 한 노드 에서 다른 노드 에 도착 하 는 데 1 단위 의 시간 이 필요 하 다 고 가정 하고 노드 를 검색 하 는 시간 은 무시 합 니 다. 그러면 비비 의 핸드폰 이 k 번호 의 노드 에 있 을 때 그 는 몇 단위 의 시간 이 걸 려 야 핸드폰 을 찾 을 수 있 습 니까?
★ 데이터 입력 입력 첫 번 째 행위 의 정수 n (1 ≤ n ≤ 100000) 은 나무의 노드 수 를 나타 내 고 나무의 뿌리 번 호 는 항상 1 이다.다음 n - 1 줄, 각 줄 에 두 개의 정수 p, x (1 ≤ x ≤ 100).번호 가 i 인 노드 를 대표 하 는 아버지 노드 p 와 가중치 x.여기 i 는 2 에서 n 까지 입 니 다.데 이 터 는 입력 한 p 가 현재 i 보다 적 고 서로 형제 인 두 노드 의 가중치 x 가 다르다 는 것 을 보증 합 니 다.n + 1 행 하나의 정수 m (1 ≤ m ≤ n) 는 문의 조 수 를 나타 낸다.n + 2 줄 에는 m 개의 정수 가 있 고 각 정수 ki (1 ≤ ki ≤ n) 는 이 그룹 을 대표 하여 문의 중인 핸드폰 의 위 치 를 나타 낸다.
★ 데이터 출력 m 줄, 줄 마다 하나의 정수, 비비 가 핸드폰 을 찾 는 데 걸 리 는 단위 시간 수량 을 나타 낸다.
예제 입력
출력 예시
31 201 3031 2 3
0 3 1
문제 풀이 의 사고 방향.
두 갈래 나무 dfs 한 번 걷 기
주의해 야 할 것 은 모든 노드 에 대해 노드 진입 과 탈퇴 노드 step 는 모두 + 1 해 야 한 다 는 것 이다.
code
#include
#include
#include <string.h>
struct Node
{
Node(){}
int weight;
int step;
int left;
int right;
};
Node *arr = NULL;
int step = 0;
void dfs(int index)
{
arr[index].step = step;
++step;
if(arr[index].left==0)
{
}
else if(arr[index].right==0)
{
dfs(arr[index].left);
}
else if(arr[arr[index].left].weight > arr[arr[index].right].weight)
{
dfs(arr[index].left);
dfs(arr[index].right);
}
else
{
dfs(arr[index].right);
dfs(arr[index].left);
}
++step;
}
int main()
{
int i;
int n,m,k;
scanf("%d",&n);
arr = (Node *)malloc(sizeof(Node)*(n+1));
memset(arr,0,sizeof(Node)*(n+1));
int fa_index,weight;
for(i=2;i<=n;i++)
{
scanf("%d %d",&fa_index,&weight);
if(arr[fa_index].left==NULL)
arr[fa_index].left = i;
else // (arr[fa_index].left!=NULL)
arr[fa_index].right = i;
arr[i].weight = weight;
}
dfs(1);
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d",&k);
printf("%d ",arr[k].step);
}
free(arr);
return 0;
}
다음으로 전송:https://www.cnblogs.com/cbattle/p/7790227.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.