hihocoder 1069最近公共祖先(DFS + ST)java实现

原创 2016年05月30日 16:06:34

package tree;


import java.util.ArrayList;

import java.util.HashMap;

import java.util.Map.Entry;

import java.util.Scanner;


/*

 * 8

adam sam

sam joey

tom lv

tom lee

kevin john

adam kevin

sam peter

sam tom

 */

public class Week17 {


public static void main(String[] args) {

Scanner scanner =new Scanner(System.in);

int datanum = Integer.parseInt(scanner.nextLine());

HashMap<String, ArrayList<String>> DFSmap = new HashMap<String, ArrayList<String>>();

ArrayList<DFSNode17> DFSarrAdep = new ArrayList<DFSNode17>();

HashMap<String, Integer> fAppearMap = new HashMap<String, Integer>();

DFSNode17 [][]ST =new DFSNode17[2*datanum + 2][2*datanum + 2];

String admisssion =null;

for(inti=0; i<datanum;i++){

String data =scanner.nextLine();

String father =data.split(" ")[0];

String son =data.split(" ")[1];

if(i==0)admisssion = father;

Week17.createDFSmap(DFSmap,father, son);

}

Week17.DFS(admisssion, 0,DFSmap, DFSarrAdep,fAppearMap);

Week17.createST(DFSarrAdep,ST);

int querynum = Integer.parseInt(scanner.nextLine());

for(inti=0; i<querynum;i++){

String data =scanner.nextLine();

String p1 =data.split(" ")[0];

String p2 =data.split(" ")[1];

Week17.searchST(p1,p2, ST, fAppearMap);

}

}

public static void createDFSmap(HashMap<String, ArrayList<String>>DFSmap, String father, Stringson){

if(DFSmap.containsKey(father)){

ArrayList<String> temp = DFSmap.get(father);

temp.add(son);

}

else{

ArrayList<String> temp = new ArrayList<String>();

temp.add(son);

DFSmap.put(father,temp);

}

}

public static void DFS(String admisssion, int depth, HashMap<String, ArrayList<String>> DFSmap, ArrayList<DFSNode17>DFSarrAdep, HashMap<String, Integer> fAppearMap){

DFSarrAdep.add(new DFSNode17(admisssion,depth));

if(!fAppearMap.containsKey(admisssion))fAppearMap.put(admisssion,DFSarrAdep.size()-1);

if(DFSmap.containsKey(admisssion)){

ArrayList<String> temp = DFSmap.get(admisssion);

for(inti=0; i<temp.size();i++){

DFS(temp.get(i), ++depth,DFSmap, DFSarrAdep,fAppearMap);

depth--;

DFSarrAdep.add(new DFSNode17(admisssion,depth));

}

}

}

public static void createST(ArrayList<DFSNode17>DFSarrAdep, DFSNode17 [][]ST){

for(inti=1; i<ST[0].length;i*=2){

for(intj=1; j<ST.length;j++){

if(i==1)ST[j][i] =DFSarrAdep.get(j-1);

else{

if(j +i/2 < ST.length){

int depth1 = ST[j][i/2].getDepth();

int depth2 = ST[j +i/2][i/2].getDepth();

ST[j][i] =depth1 > depth2 ?ST[j + i/2][i/2] : ST[j][i/2];

}

else ST[j][i] =ST[j][i/2];

}

}

}

}

public static void searchST(String p1, String p2, DFSNode17 [][]ST, HashMap<String, Integer>fAppearMap){

if(p1.equals(p2)) System.out.println(p1);

else{

intappear1 = fAppearMap.get(p1) + 1;

intappear2 = fAppearMap.get(p2) + 1;

intleft, right;

if(appear1 >appear2){

left =appear2;

right =appear1;

}

else{

left =appear1;

right =appear2;

}

int range = right - left + 1;

int power = 0;

while(range != 0){

range >>= 1;

power++;

}

int depth1 = ST[left][(int)Math.pow(2,power-1)].getDepth();

int depth2 = ST[right - (int)Math.pow(2,power-1) + 1][(int)Math.pow(2,power-1)].getDepth();

String name =depth1 <= depth2 ?ST[left][(int)Math.pow(2,power-1)].getValue() : 

ST[right - (int)Math.pow(2,power-1) + 1][(int)Math.pow(2,power-1)].getValue(); 

System.out.println(name);

}

}

}


class DFSNode17{

private Stringvalue;

privateint depth;

public DFSNode17(Stringvalue, int depth){

this.value =value;

this.depth =depth;

}


public String getValue() {

returnvalue;

}


public void setValue(String value) {

this.value =value;

}


public int getDepth() {

returndepth;

}


public void setDepth(int depth) {

this.depth =depth;

}


}

hihocoder #1069 : 最近公共祖先·三(ST求LCA)

题目:http://hihocoder.com/problemset/problem/1069?sid=1175440 思路:就是map存储求LCA,然而开始模板弄错了,wa了n次 代码:#inc...
  • huatian5
  • huatian5
  • 2017年09月20日 17:20
  • 148

hihoCoder 1069 最近公共祖先 在线算法

题意 多组询问,求最近公共祖先 思路 基本思路就是,把节点映射到一个数组的下标中,然后数组记录每个点的深度 我们需要保证,每两个节点映射的位置间,存在只存在它俩的最近公共祖先,而不存在其它祖先 我们先...
  • luke2834
  • luke2834
  • 2016年01月30日 00:53
  • 527

hihoCoder 1069 最近公共祖先·三

#include using namespace std; map nameMap; string names[100005]; struct node{ int pa; vector so...
  • piaocoder
  • piaocoder
  • 2015年08月02日 17:17
  • 213

[HihoCoder]#1069 : 最近公共祖先·三

华电北风吹 天津大学认知计算与应用重点实验室 2016-06-24题目链接: http://hihocoder.com/problemset/problem/1062题目分析: // pr...
  • zhangzhengyi03539
  • zhangzhengyi03539
  • 2016年06月24日 00:42
  • 231

【算法】最近公共祖先之在线算法(RMQ-ST)

在线算法是基于RMQ-ST算法的基础上进行的RMQ问题求解算法给定一个整型数组,长度为n,寻找区间内的极值,m表示询问的次数。求解算法不外乎下面两种: 1、最基础的算法就是每次都遍历一次区间则时间复...
  • gesanghuazgy
  • gesanghuazgy
  • 2016年05月25日 14:34
  • 1123

巧用深度优先遍历(DFS)查找两个结点的最近公共祖先

巧用后序遍历查找两个结点的最近祖先今天在论坛上看到一个问题:已知一棵链式存储的二叉树上的两个结点p、q,求解如何快速找到他们的公共祖先。 说实话,我的第一个念头就是吐槽为什么不用数组存储二叉树呢?...
  • Changxing898
  • Changxing898
  • 2017年04月23日 20:01
  • 583

LCA(最近公共祖先算法)之在线st表法

第一篇博文,练练手,做个笔记,呵呵。 有关于LCA问题不再赘述,简而言之就是树上两点的最近祖先节点。使用st表方法建表效率O(nlogn),查询基本上是O(1),而且应用灵活,可一边读入一边输出,而且...
  • henryn111
  • henryn111
  • 2016年08月22日 23:02
  • 363

最近公共祖先问题(ST算法)

推荐几篇讲解该问题比较详细的博客点击打开链接 点击打开链接  点击打开链接  本篇主要讲解如何采用解决RMQ问题的ST算法来解决LCA问题 步骤如下: 1 DFS遍历 DFS序用ver[max...
  • qq_37521566
  • qq_37521566
  • 2018年01月23日 14:52
  • 7

LCA 在线算法 dfs + ST算法 总结 hihocoder 1069

链接:http://hihocoder.com/problemset/problem/1069 思想: 利用dfs + ST 算法 记录下dfs的序列,还有dfs过程中每一个点的深度,对应到之前...
  • liujc_
  • liujc_
  • 2016年03月16日 16:29
  • 1420

java--数据结构--二叉树的最近公共祖先

1.若是二叉搜索树思路: 如果p,q 比root小, 则LCA必定在左子树;如果p,q 比root大, 则LCA必定在右子树;若一小一大,则LCA是root /** * Definition f...
  • github_34514750
  • github_34514750
  • 2016年08月17日 11:09
  • 1144
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hihocoder 1069最近公共祖先(DFS + ST)java实现
举报原因:
原因补充:

(最多只允许输入30个字)