• 北邮OJ-257- 最近公共祖先-软件14 java


    思路分析:思路应该比较简单也很容易想的来,就是比较两个节点的最近的祖先节点,要对每个节点依次记录下他的所有祖先节点,包括其自己,因为自己也算自己的祖先节点,这一点题目中没有明确指出 所以比较坑。

    我们可以用一个数组表示某个节点的父节点是谁,在判断的时候顺着数组遍历下去就能达到根节点1,并依次记录下该节点的所有的祖先节点。再与另外一个节点的所有的祖先进行比较。

    Problem C. 最近公共祖先 
    题目描述 
    给出一棵有N个节点的有根树TREE(根的编号为1),对于每组查询,请输出树上节点u和v的最近公共祖先。 
    最近公共祖先:对于有向树TREE的两个结点u,v。最近公共祖先LCA(TREE u,v)表示一个节点x,满足x是u、v的祖先且x的深度尽可能大。 
    输入格式 
    输入数据第一行是一个整数T(1<=T<=100),表示测试数据的组数。 
    对于每组测试数据: 
    第一行是一个正整数N(1<=N<=100),表示树上有N个节点。 
    接下来N-1行,每行两个整数u,v(1<=u,v<=N),表示节点u是v的父节点。 
    接下来一行是一个整数M(1<=M<=1000),表示查询的数量。 
    接下来M行,每行两个整数u,v(11<=u,v<=N),表示查询节点u和节点v的最近公共祖先。 
    输出格式 
    对于每个查询,输出一个整数,表示最近公共祖先的编号, 
    输入样例 


    1 2 
    1 3 

    2 3 

    1 2 
    1 3 
    3 4 

    2 3 
    3 4 


    3
     

    package test;
    
    import java.io.BufferedInputStream;
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class ZuijinZuxianMain {
    	static Scanner scan = new Scanner(new  BufferedInputStream(System.in));
    	static int tree[];
    	public static void main(String[] args) {
    		int  T = scan.nextInt();
    		for(int i = 0 ;i<T;i++){
    			int N = scan.nextInt();
    		 tree = new int[N+1];
    			for(int j = 1;j<=N-1;j++){
    				int a = scan.nextInt();
    				int b = scan.nextInt();
    				tree[b] = a; //数组的值为其父节点
    			}
    			int M = scan.nextInt();
    			for(int k = 0;k<M;k++){
    				int c = scan.nextInt();
    				int d = scan.nextInt();
    				panduan(c,d);
    			}
    		}
    	}
    	private static void panduan(int c,int d) {
    		int flagc =c,flagd=d;
    		ArrayList<Integer> list = new ArrayList<Integer>();
    		list.add(c);
    		while(tree[flagc]!=0){
    			list.add(tree[flagc]);
    			flagc = tree[flagc];
    		}
    		
    		ArrayList<Integer> list1 = new ArrayList<Integer>();
    		list1.add(d);
    		while(tree[flagd]!=0){
    			list1.add(tree[flagd]);
    			flagd = tree[flagd];
    		}
    			for(int i1=0;i1<=list.size();i1++){
    				if(list1.contains(list.get(i1))){
    					System.out.println(list.get(i1));
    					break;
    				}
    			}
    	}
    }
    
  • 相关阅读:
    Windows 环境 cygwin 安装 SSH
    看见上帝的 10 个公式……
    移动平均
    分位数
    算术平均、几何平均、调和平均、平方平均和移动平均
    平均数、中位数和众数及它们之间的关系
    10 个超炫绘制图表图形的 Javascript 插件【转载+整理】
    “服务器推”技术【转载+整理】
    网站数据监控监测系统
    Active Directory 域服务(AD DS)
  • 原文地址:https://www.cnblogs.com/lingluan533/p/12537292.html
Copyright © 2020-2023  润新知