2370 小機房的樹 (倍增LCA)

2021-07-17 05:14:22 字數 1186 閱讀 6924

小機房有棵煥狗種的樹,樹上有n個節點,節點標號為0到n-1,有兩隻蟲子名叫飄狗和大吉狗,分居在兩個不同的節點上。有一天,他們想爬到乙個節點上去搞基,但是作為兩隻蟲子,他們不想花費太多精力。已知從某個節點爬到其父親節點要花費 c 的能量(從父親節點爬到此節點也相同),他們想找出一條花費精力最短的路,以使得搞基的時候精力旺盛,他們找到你要你設計乙個程式來找到這條路,要求你告訴他們最少需要花費多少精力

第一行乙個n,接下來n-1行每一行有三個整數u,v, c 。表示節點 u 爬到節點 v 需要花費 c 的精力。

第n+1行有乙個整數m表示有m次詢問。接下來m行每一行有兩個整數 u ,v 表示兩隻蟲子所在的節點

輸出描述 output description

一共有m行,每一行乙個整數,表示對於該次詢問所得出的最短距離。

1 0 1

2 0 1

1 02 0

1 21<=n<=50000, 1<=m<=75000, 0<=c<=1000

倍增lca模板

#include

#include

#define m 1000001

using namespace std;

int f[m][31];

int dis[m];

struct node ;

node e[m];

int tot,head[m];

int n,m;

int deep[m];

inline int

read(int&x)

inline void dfs(int now,int from,int dep,int v)

}/*inline void dfs(int u,int dep)

}}*/inline void add(int

x,int

y,int z)

inline int lca(int a,int b)

int main()

dfs(1,1,0,0);

for(int j=1;j<=30;j++)

for(int i=1;i<=n;i++)

f[i][j]=f[f[i][j-1]][j-1];

read(m);

for(int i=1;i<=m;i++)

return

0;}

2370 小機房的樹,lca

小機房有棵煥狗種的樹,樹上有n個節點,節點標號為0到n 1,有兩隻蟲子名叫飄狗和大吉狗,分居在兩個不同的節點上。有一天,他們想爬到乙個節點上去搞基,但是作為兩隻蟲子,他們不想花費太多精力。已知從某個節點爬到其父親節點要花費 c 的能量 從父親節點爬到此節點也相同 他們想找出一條花費精力最短的路,以使...

codevs 2370 小機房的樹 (LCA)

codevs 2370 小機房的樹 題意 就是求裸的lca 題解 include include include using namespace std const int maxn 100000 int fa maxn 21 第i個節點跳2 j次方步找到的父節點 int dis maxn 21 第...

codevs 2370 小機房的樹 (LCA)

小機房有棵煥狗種的樹,樹上有n個節點,節點標號為0到n 1,有兩隻蟲子名叫飄狗和大吉狗,分居在兩個不同的節點上。有一天,他們想爬到乙個節點上去搞基,但是作為兩隻蟲子,他們不想花費太多精力。已知從某個節點爬到其父親節點要花費 c 的能量 從父親節點爬到此節點也相同 他們想找出一條花費精力最短的路,以使...