hihocoder 1062 : 最近公共祖先·一

時間限制:10000ms
單點時限:1000ms
內存限制:256MB

描述

小Ho最近發現了一個神奇的網站!雖然還不夠像58同城那樣神奇,但這個網站仍然讓小Ho樂在其中,但這是爲什麼呢?

“爲什麼呢?”小Hi如是問道,在他的觀察中小Ho已經沉迷這個網站一週之久了,甚至連他心愛的樹玩具都棄置一邊。

“嘿嘿,小Hi,你快過來看!”小Ho招呼道。

“你看,在這個對話框裏輸入我的名字,在另一個對話框裏,輸入你的名字,再點這個查詢按鈕,就可以查出來……什麼!我們居然有同一個祖祖祖祖祖爺爺?”

“誒,真是誒……這個網站有點厲害啊。”小Hi不由感嘆道。

“是啊,這是什麼算法啊,這麼厲害!”小Ho也附和道。

“別2,我說的是他能弄到這些數據很厲害,而人類的繁殖樹這種層數比較淺的樹對這類算法的要求可是簡單的不得了,你都能寫出來呢!”小Hi道。

“啊?我也能寫出來?可是……該從哪開始呢?”小Ho困惑了。

小Ho要面臨的問題是這樣的,假設現在他知道了N個人的信息——他們的父親是誰,他需要對於小Hi的每一次提問——兩個人的名字,告訴小Hi這兩個人的是否存在同一個祖先,如果存在,那麼他們的所有共同祖先中輩分最低的一個是誰?

提示:不着急,慢慢來,另外我有一個問題:挖掘機技術哪家強?!

輸入

每個測試點(輸入文件)有且僅有一組測試數據。

每組測試數據的第1行爲一個整數N,意義如前文所述。

每組測試數據的第2~N+1行,每行分別描述一對父子關係,其中第i+1行爲兩個由大小寫字母組成的字符串Father_i, Son_i,分別表示父親的名字和兒子的名字。

每組測試數據的第N+2行爲一個整數M,表示小Hi總共詢問的次數。

每組測試數據的第N+3~N+M+2行,每行分別描述一個詢問,其中第N+i+2行爲兩個由大小寫字母組成的字符串Name1_i, Name2_i,分別表示小Hi詢問中的兩個名字。

對於100%的數據,滿足N<=10^2,M<=10^2, 且數據中所有涉及的人物中不存在兩個名字相同的人(即姓名唯一的確定了一個人)。

輸出

對於每組測試數據,對於每個小Hi的詢問,輸出一行,表示查詢的結果:如果根據已知信息,可以判定詢問中的兩個人存在共同的祖先,則輸出他們的所有共同祖先中輩分最低的一個人的名字,否則輸出-1。

樣例輸入
11
JiaYan JiaDaihua
JiaDaihua JiaFu
JiaDaihua JiaJing
JiaJing JiaZhen
JiaZhen JiaRong
JiaYuan JiaDaishan
JiaDaishan JiaShe
JiaDaishan JiaZheng
JiaShe JiaLian
JiaZheng JiaZhu
JiaZheng JiaBaoyu
3
JiaBaoyu JiaLian
JiaBaoyu JiaZheng
JiaBaoyu LinDaiyu
樣例輸出
JiaDaishan
JiaZheng
-1
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;

public class Main {
	static HashMap<String,String> map=new HashMap<String,String>();
	public static void main(String[] args) {
		Main main=new Main();
		Scanner scan=new Scanner(System.in);
		int num=scan.nextInt();
		map=new HashMap<String,String>();
		for(int i=0;i<num;i++){
			String father=scan.next();
			String son=scan.next();
			map.put(son,father);
		}
		int count=scan.nextInt();
		List<String[]> list=new ArrayList<String[]>();
		for(int i=0;i<count;i++){
			String[] temp=new String[2];
			temp[0]=scan.next();
			temp[1]=scan.next();
			list.add(temp);
		}
		for(String[] arr:list){
			System.out.println(main.solve(map, arr[0], arr[1]));
		}
	}	
	public String solve(HashMap<String,String> map,String a,String b){
		if(a.equals("b")) return a;
		String temp=a;
		HashSet<String> set=new HashSet<String>();
		while(map.containsKey(temp)){
			set.add(temp);
			temp=map.get(temp);
		}
		set.add(temp);
		String temp2=b;
		while(map.containsKey(temp2)){
			if(set.contains(temp2)) return temp2;
			temp2=map.get(temp2);
		}
		if(set.contains(temp2)) return temp2;
		return "-1";
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章