제목 1368: 두 갈래 나무와 어떤 값의 경로 - 9도

2348 단어
제목 설명:
두 갈래 트리와 정수를 입력하고 두 갈래 트리의 결점 값과 정수를 입력하기 위한 모든 경로를 출력합니다.경로는 나무의 뿌리 결점에서 시작하여 잎 결점까지 내려가는 결점으로 경로를 형성합니다.
입력:
각 테스트 사례에는 n+1 행이 포함됩니다.
첫 번째 행위는 2개의 정수 n, k(1<=n<=10000), n은 결점의 개수를 나타내고, k는 요구하는 경로와 결점 번호를 1부터 n까지 나타낸다.                                                                                                      
다음은 n줄이 있다.이 n행에서 매 행위 3개의 정수vi,leftnode,rightnode,vi는 i번째 결점의 값을 나타내고,leftnode는 i번째 결점의 왼쪽 아이의 결점 번호를 나타내고,rightnode는 i번째 결점의 오른쪽 아이의 결점 번호를 나타내며, 결점 값이 없으면 -1이다.번호가 1인 결점은 루트 결점입니다.
출력:
모든 테스트 사례에 대응하여 "result:"를 출력하여 한 줄을 차지하고 다음에 사전 순서에 따라 조건을 충족시키는 모든 경로를 출력합니다. 이 경로는 결점 번호로 구성되고 출력 형식은 출력 샘플을 참조합니다.
샘플 입력:
5 22
10 2 3
5 4 5
12 -1 -1
4 -1 -1
7 -1 -1
1 5
1 -1 -1
샘플 출력:
result:
A path is found: 1 2 5
A path is found: 1 3
result:
추천 지수: ※
출처:http://ac.jobdu.com/problem.php?pid=1368
PAT의http://blog.csdn.net/zhu_liangwei/article/details/9735741유사하다.
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
typedef struct node{
    int val;
    int left;
    int right;
}node;
vector<int> path;
void print_path(){
    printf("A path is found:");
    for(int i=0;i<path.size();i++){
       printf(" %d",path[i]); 
    }
    printf("
"); } void find_fit_path(int curr,int i,const node *t){ if(i!=-1&&t[i].val==curr&&-1==t[i].left&&-1==t[i].right){ path.push_back(i); print_path(); path.pop_back(); } else if(t[i].val<curr){ int tmp=min(t[i].left,t[i].right); path.push_back(i); if(tmp!=-1) find_fit_path(curr-t[i].val,tmp,t); tmp=max(t[i].left,t[i].right); if(tmp!=-1) find_fit_path(curr-t[i].val,tmp,t); path.pop_back(); } } int main() { int n,k,i; while(scanf("%d%d",&n,&k)!=EOF){ node *tree=new node[n+1]; for(i=1;i<=n;i++) scanf("%d%d%d",&tree[i].val,&tree[i].left,&tree[i].right); printf("result:
"); find_fit_path(k,1,tree); } }

좋은 웹페이지 즐겨찾기