1. 程式人生 > >[HihoCoder]#1067 : 最近公共祖先·二

[HihoCoder]#1067 : 最近公共祖先·二

華電北風吹
天津大學認知計算與應用重點實驗室
2016-06-24

題目分析:
目前程式碼超時,需要改進。

// problem1067.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"

#include <iostream>
#include <string>
#include <map>
#include <set>
#include <vector>
#include <stack>
using namespace std;

#define SIZE 405

int father[SIZE];

stack
<int>
GetFatherList(int sonID) { stack<int> result; while (father[sonID] != sonID) { result.push(sonID); sonID = father[sonID]; } result.push(sonID); return result; } int main() { for (int i = 0; i < SIZE; i++) { father[i] = i; } int
N, M; cin >> N; int count = 0; map<string, int> namemap; map<int, string> namemapInt; for (int i = 0; i < N; i++) { string name_father, name_son; cin >> name_father >> name_son; int id_father = namemap[name_father]; int
id_son = namemap[name_son]; if (id_father == NULL) { count++; id_father = count; namemap[name_father] = id_father; namemapInt[id_father] = name_father; } if (id_son == NULL) { count++; id_son = count; namemap[name_son] = id_son; namemapInt[id_son] = name_son; } father[id_son] = id_father; } cin >> M; for (int i = 0; i < M; i++) { string name1, name2; cin >> name1 >> name2; int id1 = namemap[name1]; int id2 = namemap[name2]; if (id1 == NULL) { count++; id1 = count; namemap[name1] = id1; namemapInt[id1] = name1; } if (id2 == NULL) { count++; id2 = count; namemap[name2] = id2; namemapInt[id2] = name2; } stack<int> s1, s2; s1 = GetFatherList(id1); s2 = GetFatherList(id2); if (s1.top() != s2.top()) { cout << "-1" << endl; } else { int resultID; while ((s1.empty() == false) && (s2.empty() == false) && (s1.top() == s2.top())) { resultID = s1.top(); s1.pop(); s2.pop(); } cout << namemapInt[resultID] << endl; } } return 0; }

相關推薦

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

華電北風吹 天津大學認知計算與應用重點實驗室 2016-06-24 題目分析: 目前程式碼超時,需要改進。 // problem1067.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #includ

hihoCoder 1067 : 最近公共祖先·(map+離線Tarjan演算法)

【思路分析】離線演算法是把所有的詢問先儲存起來,然後在深搜的過程中計算結果。本題本來就是一棵有根樹,應該先計算根節點是多少,然後再從根節點進行深搜。實現為+深搜+並查集。 【AC程式碼】 #

hihocoder 1067 最近公共祖先· 並查集+stl

題目連結: 題解思路: 面對10^5個 名字和10^5條詢問,肯定要用到特殊的方法: 1.把所有的詢問先存下來,然後再遍歷一次整棵樹得到所有答案 2.遍歷的過程中   查詢含當前節點的 所有詢問,然後找到詢問中的另一個節點;檢視另一個節點的狀態。     

HihoCoder 1067 最近公共祖先·

信息 dep 字符串 log i+1 ++ 緊急 next fat 最近公共祖先·二 時間限制:10000ms 單點時限:1000ms 內存限制:256MB 描述 上上回說到,小Hi和小Ho用非常拙劣——或者說粗糙的手段山寨出了一個神奇的網站,這個網站可以計算

[hiho]#1067 : 最近公共祖先· 離線演算法

描述:(原題地址:http://hihocoder.com/problemset/problem/1067?sid=601284) 給定一顆樹,給出樹根,以及一些查詢pair,要求輸出每條查詢pair的最近公共節點。 保證所有查詢節點都在這棵樹上。 輸入:第一行一個整數N代

#1067 : 最近公共祖先·

題目連結   及  思路參考 輸入 每個測試點(輸入檔案)有且僅有一組測試資料。 每組測試資料的第1行為一個整數N,意義如前文所述。 每組測試資料的第2~N+1行,每行分別描述一對父子關係,其中第i+1行為兩個由大小寫字母組成的字串Father_i, Son_i

hihoCoder week13 最近公共祖先·一

祖先 () 搜索 另一個 get div end ace n) 用的dfs,自下往上搜索一個節點的所有祖先,然後在相應祖先 判斷是否是另一個節點的祖先,如果是 就截止,否則繼續往上搜索,直到搜索到,或者知道所有的祖先都被掃描完成 #include <bits/s

hihoCoder week17 最近公共祖先·三 lca st表

col cin mes map ons ini include name pan 記錄dfs序列,dfn[tot] 記錄第tot次訪問的節點 然後查兩點在dfs序中出現的第一次 id[u] id[v] 然後 找 dep[k] = min( dep[i] ) {i 屬於

hihoCoder week17 最近公共祖先·三 lca st表

記錄dfs序列,dfn[tot] 記錄第tot次訪問的節點 然後查兩點在dfs序中出現的第一次 id[u] id[v] 然後  找 dep[k] = min( dep[i] ) {i 屬於 [id[u], id[v]]} 最後dfn[k] 就是所求.. 感覺弄來弄去 就是 在對映... 無非

[ACM] hihocoder 1062 最近公共祖先·一 (一般做法)

描述 小Ho最近發現了一個神奇的網站!雖然還不夠像58同城那樣神奇,但這個網站仍然讓小Ho樂在其中,但這是為什麼呢? “為什麼呢?”小Hi如是問道,在他的觀察中小Ho已經沉迷這個網站一週之久了,甚至連他心愛的樹玩具都棄置一邊。 “嘿嘿,小Hi,你快過來看!”小Ho招呼道

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

華電北風吹 天津大學認知計算與應用重點實驗室 2016-06-24 題目分析: // problem1069.cpp : 定義控制檯應用程式的入口點。 // #1069 : 最近公共祖先·三 // 張正義 2016-06-20 #incl

叉樹最近公共祖先

ret highlight 筆試 代碼 light brush 二叉 init blog 給定一棵二叉樹,找到兩個節點的最近公共父節點(LCA)。最近公共祖先是兩個節點的公共的祖先節點且具有最大深度。 樣例:對於下面這棵二叉樹 4 / \3 7 / \ 5

叉樹中任意兩個節點的最近公共祖先

stc node comm cnblogs blog style == spa 發現 public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p,

【leetcode 簡單】 第六十八題 叉搜索樹的最近公共祖先

comm turn etc add style 存在 solution span 二叉 給定一個二叉搜索樹, 找到該樹中兩個指定節點的最近公共祖先。 百度百科中最近公共祖先的定義為:“對於有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q

leetcode 236. 叉樹的最近公共祖先(Lowest Common Ancestor of a Binary Tree) beat 99.05%

給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。 百度百科中最近公共祖先的定義為:“對於有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度儘可能大(一個節點也可以是它自己的祖先)。” 例如,給定如下二叉樹:  root

【LeetCode 簡單題】64-叉搜尋樹的最近公共祖先

宣告: 今天是第64道題。給定一個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除 (手動比心ღ( ´・ᴗ・` )) 正文 題目:

235,叉搜尋樹的最近公共祖先

給定一個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。 百度百科中最近公共祖先的定義為:“對於有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度儘可能大(一個節點也可以是它自己的祖先)。” 例如,給定如下二叉搜尋樹: 

LeetCode-236 lowest common ancestor of a binary tree 叉樹的最近公共祖先

題目連結 https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/ 題意         中文題,就是給出一個一般的二叉樹,求其最近公共祖先,並且宣告節點

LeetCode-235 lowest-common-ancestor-of-a-binary-search-tree 叉搜尋樹的最近公共祖先

題目連結 LeetCode-235 lowest-common-ancestor-of-a-binary-search-tree 題意 中文題,注意,題目要求是“二叉搜尋樹”,這就大大化簡題目難度了。 題解         比較簡單了,

leetcode 235. 叉搜尋樹的最近公共祖先(Python)[Easy]

題目: 給定一個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。 百度百科中最近公共祖先的定義為:“對於有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度儘可能大(一個節點也可以是它自己的祖先)。” 例如,給定如下二叉搜尋樹:&