1. 程式人生 > >簡單高效的最近公共祖先問題c++實現

簡單高效的最近公共祖先問題c++實現

#include "stdafx.h"
#include <string>  
#include <iostream>  
#include <algorithm>  
#include <map>  
using namespace std;
//這個的含義是,建立一個雜湊表,鍵值是兒子
//值為父親,即將父親和兒子的對映關鍵建立
//注意一個父親可以有多個孩子,因此將兒子作為鍵值,是一一對應的關係
map<string, string> sf;//son,father
map<string, int> vis;//判斷是否已經訪問
int
n, m; //要查詢的兩個孩子 void find(string a, string b) { vis.clear(); string tmp = a; while (!tmp.empty()) //找出這個孩子的左右祖先 { vis[tmp] = 1;//標記訪問 //在雜湊表中查詢,如果他有父親的話,則將父親給temp tmp = sf[tmp]; //在查詢父親的父親 } //即完成了尋找這個孩子的所有祖先的問題 tmp = b;//將b孩子給temp,注意多了一個條件 while (!tmp.empty() && !vis[tmp]) //即只需要找到未標記到的即可
tmp = sf[tmp];//因為,如果已標記了的話,則一定是兩個孩子的最近公共祖先 if (!tmp.empty())//如果不空的話,則輸出這個祖先 cout << tmp << endl; else cout << -1 << endl; } //測試 int main() { string a, b; scanf("%d", &n); sf.clear(); while (n--) { cin >> a >> b; sf[b] = a; } scanf
("%d", &m); while (m--) { cin >> a >> b; find(a, b); } return 0; }

相關推薦

cogs 2478. [HZOI 2016]簡單最近公共祖先

lld fault 兩節點 有根樹 cnblogs ont 給定 tar algo 2478. [HZOI 2016]簡單的最近公共祖先 ★☆ 輸入文件:easy_LCA.in 輸出文件:easy_LCA.out 簡單對比時間限制:2 s 內存限制:128

簡單高效最近公共祖先問題c++實現

#include "stdafx.h" #include <string> #include <iostream> #include <algorithm&

C++】最近公共祖先LCA(Tarjan離線算法)&& 洛谷P3379LCA模板

target sizeof add 例題 開始 實現 再看 根節點 strong 1.前言   首先我們介紹的算法是LCA問題中的離線算法-Tarjan算法,該算法采用DFS+並查集,再看此算法之前首先你得知道並查集(盡管我相信你如果知道這個的話肯定是知道並查集的),

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

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

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

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

C++ P3379 【模板】最近公共祖先(LCA)

早就想寫LCA了,奈何沒有dfs基礎,先做了最小生成樹 廢話就說到這裡,上程式碼。 #include<cstdio> #include<iostream> #include<algorithm> #include<cstri

【LeetCode】236. 二叉樹的最近公共祖先 結題報告 (C++)

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

LeetCode 236 -- 二叉樹的最近公共祖先 ( Lowest Common Ancestor of a Binary Tree ) ( C語言版 )

題目描述 :  解題思路 : 使用遞迴查詢 , 如果有一個節點與根節點匹配 , 那麼直接返回根節點 , 否則依次在左子樹和右子樹中查詢 ,並且用left 和right分別記錄左子樹的返回值和右子樹的返回值 , 如果節點都存在左子樹中 , 那麼right就一定為NULL

【Codeforces Round 362 (Div 2)C】【STL-map 最近公共祖先思想】Lorenzo Von Matterhorn 數域二叉樹的路徑權值變更查詢

Barney lives in NYC. NYC has infinite number of intersections numbered with positive integers starting from 1. There exists a bidirectional road between

利用棧結構實現二叉樹的非遞迴遍歷,求二叉樹深度、葉子節點數、兩個結點的最近公共祖先及二叉樹結點的最大距離

原文地址:http://blog.csdn.net/forbes_zhong/article/details/51227747 利用棧實現二叉樹的非遞迴遍歷,並求二叉樹的深度、葉子節點數、兩個節點的最近公共祖先以及二叉樹結點的最大距離,部分參考《劍指offer》這本書

一般二叉樹求最近公共祖先(最簡單的程式碼)

當遍歷到一個root點的時候, 1.判斷root是不是null如果root為null,那麼就無所謂祖先節點,直接返回null就好了 2.如果root的左子樹存在p,右子樹存在q,那麼root肯定就是最近祖先 3.如果pq都在root的左子樹,那麼就需要遞迴

235. 二叉搜尋樹的最近公共祖先(leetcode/C++)

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

tarjan算法求最近公共祖先

技巧 splay 路徑壓縮 tor 沒有 blog 分析 father mar tarjian算法 LCA: LCA(Least Common Ancestor),顧名思義,是指在一棵樹中,距離兩個點最近的兩者的公共節點。也就是說,在兩個點通往根的道路上,肯定會有公共的節

[轉]LCA 最近公共祖先

log 比較 下一步 個人 idt 合並函數 orz ref tle 原文傳送門orzJVxie Tarjan(離線)算法的基本思路及其算法實現     首先是最近公共祖先的概念(什麽是最近公共祖先?):     在一棵沒有環的樹上,每個節點肯定有其父親節點和祖先節點

lca(洛谷P3379 最近公共祖先(LCA))

int arc pragma rpi == 代碼 輸出 () div 如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先. 輸入格式: 第一行包含三個正整數N、M、S,分別表示樹的結點個數、詢問的個數和樹根結點的序號。 接下來N-1行每行包含兩個正整數x、y

二叉樹最近公共祖先

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

luogu_3379 【模板】最近公共祖先(LCA)

span oid ont return mes ace print next using #include<bits/stdc++.h>using namespace std;#define N 500010*2struct edge{int v,next;}

(轉)Tarjan應用:求割點/橋/縮點/強連通分量/雙連通分量/LCA(最近公共祖先)

應用 說明 lca ref father 無向圖 沒有 經理 遠的 本文轉載自:http://hi.baidu.com/lydrainbowcat/item/f8a5ac223e092b52c28d591c 作者提示:在閱讀本文之前,請確保您已經理解並掌握了基本的T

最近公共祖先+二分答案】運輸計劃

algorithm style stack fine || ron string tdi bre 答案問的是最小值且取值具有單調性,所以可以二分。 首先可以確定蟲洞一定在所有耗費時間超過mid的計劃路徑的交集上,把所有計劃按花費時間來從大到小排序就可以很容易找出它們。 在c

LCA 最近公共祖先 (模板)

ace memset air size oid int fin vector n) 1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 #i