Quick actions

cmd+k|ctrl+k

Navigation

Languages

3584

Snippet info

Language

C

Visibility

public

Author

vghjm

Created

2019-08-01T23:38:53Z

Updated

2019-08-02T01:57:44Z

#include <stdio.h>
#include <stdlib.h>

//void Printing_array(int *arr, int n, char *s);
//int Find_dept(int *tree, int index);
//int Find_anc_by_deptcmp(int *tree, int *dept, int a, int b);

//int test_mode_on = 0;
int tree_m[10001];
int dept_m[10001];
/*
void Print(int n){
    printf("\n Tree \n");
    for(int i=1; i<n+1; i++){
        printf(" %d ", tree_m[i]);
    }
    printf("\n Dept \n");
    for(int i=1; i<n+1; i++){
        printf(" %d ", dept_m[i]);
    }
    printf("\n");
}
*/

int main(void) {
    int test_case;
    int node_n;
    int a, b;
    //int *tree, *dept;
    int ans;
    int first=1;
    
    scanf("%d", &test_case);
    for(int k=0; k<test_case; k++){
        //Init - make empty tree
        scanf("%d", &node_n);
        for(int i=0; i<10001; i++){
            tree_m[i]= 0;
            dept_m[i]=0;
        }
        //if(test_mode_on) printf("node_n= %d\n", node_n);
        //tree = (int *)malloc(sizeof(int) * (node_n+1));
        //dept = (int *)malloc(sizeof(int) * (node_n+1));
        
        //Init - allocate
        //printf("test case %d, n  %d", test_case, node_n);
        
        for(int i=0; i<node_n-1; i++){
            scanf("%d %d", &a, &b);
            //if(test_mode_on) printf("up= %d, down= %d\n", a, b);
            tree_m[b] = a;
        }
        //if(test_mode_on) Printing_array(tree, node_n, "tree");
        
        //Init - calc dept
        for(int i=1; i<node_n+1; i++){
            //dept[i] = Find_dept(tree, i);
            int p = i;
            int d = 1;
            while(tree_m[p]!=0){
                p=tree_m[p];
                d++;
            }
            dept_m[i]=d;
        }
        //if(test_mode_on) Printing_array(dept, node_n, "dept");
        //Print(node_n);
        
        //Calc
        scanf("%d %d", &a, &b);
        //if(test_mode_on) printf("\ninput: %d, %d\n", a, b);
        //ans = Find_anc_by_deptcmp(tree, dept, a, b);
        //printf("find %d %d\n", a ,b);
        
        while(a!=b){
            if(dept_m[a] >= dept_m[b]){
                a=tree_m[a];
            }else {
                b=tree_m[b];
            }
        }
        
        if(!first) printf("\n");
        printf("%d", a);
        /*
        ans = a;
        //if(test_mode_on){
        //    printf("\nans: %d\n");    
        //}else {
            if(!first) printf("\n");
            printf("%d", ans);
        //}
        //free(tree);
        //free(dept);
        */
        first=0;
        
    }//end for
    
    return 0;
}
/*
void Printing_array(int *arr, int n, char *s){
    printf("\n show %s \n", s);
    for(int i=1; i<n+1; i++){
        printf(" %d ", arr[i]);
    }
    printf("\n -------------\n");
}
*/
/*
int Find_dept(int *tree, int index){
    if(tree[index]==0) return 1;
    return Find_dept(tree, tree[index]) + 1;
}
int Find_anc_by_deptcmp(int *tree, int *dept, int a, int b){
    if(a == b){
        //if(test_mode_on) printf("\n find %d\n", a);
        return a;    
    }else if(dept[a] >= dept[b]){
        //if(test_mode_on) printf("\ndept[%d] >= dept[%d] / %d >= %d\n", a, b, dept[a], dept[b]);
        return Find_anc_by_deptcmp(tree, dept, tree[a], b);
    }else if(dept[a] < dept[b]){
        //if(test_mode_on) printf("\ndept[%d] < dept[%d] / %d < %d\n", a, b, dept[a], dept[b]);
        return Find_anc_by_deptcmp(tree, dept, a, tree[b]);    
    } 
}
*/




INFO