hihocoder 1069最近公共祖先(DFS + ST)java实现
来源:互联网 发布:fedora25 yum 配置源 编辑:程序博客网 时间:2024/06/06 04:40
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, Stringfather, 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;
privateintdepth;
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最近公共祖先(DFS + ST)java实现
- hihocoder #1069 : 最近公共祖先·三(ST求LCA)
- hihoCoder 1069 最近公共祖先·三
- hihoCoder 1069 最近公共祖先 在线算法
- [HihoCoder]#1069 : 最近公共祖先·三
- hihocoder1067[最近公共祖先·二] DFS序+ST表
- 最近公共祖先LCA(Tarjan与DFS--ST倍增)
- hihocoder#1069 : 最近公共祖先·三(DFS序列+线段树)
- hihoCoder 1062 最近公共祖先·一(两种实现)
- POJ1330.Nearest Common Ancestors——最近公共祖先(dfs+ST在线算法)
- hihocoder:#1062 : 最近公共祖先·一
- hihocoder第十三周最近公共祖先
- [hihoCoder]#1062 : 最近公共祖先·一
- [HiHoCoder]#1067 : 最近公共祖先·二
- HihoCoder第十三周:最近公共祖先 一
- hihoCoder 1062 最近公共祖先·一
- hihoCoder 1067 最近公共祖先·二
- 【算法】最近公共祖先(hihoCoder #1062)
- mysql5.7 修改root密码
- 10、内容提供者
- 面向对象的模型--UML建模基础知识
- public,private,protected
- JDBC和MyBatis的数据库连接代码
- hihocoder 1069最近公共祖先(DFS + ST)java实现
- mbatis 两张表字段重名 解决方法
- —Hessian入门
- 操作系统:用户编程接口(概念)
- 如何写好一个UITableView(完整版)
- 计时器
- Delphi“尚未调用CoInitialize”解决方法
- IOS开发 强制横屏
- boost裁剪和编译