簡單高效的最近公共祖先問題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