這道題就是標記每個點對其所在子樹的顏色增加的貢獻值,如果u和v顏色相同,那麼其中乙個在此公共祖先l到根的路徑貢獻要-1,所以在l處先減去1,相當於拋棄這一對點中前乙個點對顏色數增加的貢獻,再用第二個和後面的取最近公共祖先,依次類推.最終再將將子節點的顏色數加在一起即可(重複已經事先減去),可以看做當下每個節點都能貢獻1
#include #include #include #include #include #define maxn 100007
#define max 1500007
using namespace std;
int fa[maxn];
int find ( int x )
struct
e[2][max];
void scan ( int&x )
}int cc = 0;
int head[2][maxn];
int num[maxn];
vectora[maxn];
vectorb[max];
void add ( int flag , int u , int v )
void lca ( int u = 1 , int p = -1 )
for ( int i = head[1][u] ; i != -1 ; i = e[1][i].next )
}void dfs ( int u = 1 , int p = -1 )
} void calc ( int u = 1 , int p = 0 )
num[p] += num[u];
}int n,m;
int main ( )
cc = 0;
int up = 0;
for ( int i = 0 ; i < m ; i++ )
dfs ( );
for ( int i = 1 ; i <= up ; i++ )
b[i].clear(); }}
lca ( );
calc ( );
for ( int i = 1 ; i <= n ; i++ ) a[i].clear();
printf ( "%d" , num[1] );
for ( int i = 2 ; i <= n ; i++ )
printf ( " %d" , num[i] );
printf ( "\n" );
}}
LeetCode 236 二叉樹的最近公共祖先
給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。說明 所有節點的值都是唯一的。p q 為不同節點且均存在於給定的二叉樹中。個人思路在於先求出root到兩個節點的路徑上所需要路過的節點,分別用vecleft和vecright來儲存,然後再找出兩個陣列中第乙個相同值,如下 definition f...
Leetcode 236 二叉樹的最近公共祖先
例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 示例 1 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1 輸出 3 解釋 節點 5 和節點 1 的最近公共祖先是節點 3。示例 2 輸入 root 3,5,1,6,2,0,...
LeetCode 236 二叉樹的最近公共祖先
給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 示例 1 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1輸出 3解釋 節點5和節點1的最近公共祖先是節點3。示例 2 ...