2370 小機房的樹時間限制: 1 s
空間限制: 256000 kb
題目等級 :鑽石 diamond
傳送門題目描述 description
小機房有棵煥狗種的樹,樹上有n個節點,節點標號為0到n-1,有兩隻蟲子名叫飄狗和大吉狗,分居在兩個不同的節點上。有一天,他們想爬到乙個節點上去搞基,但是作為兩隻蟲子,他們不想花費太多精力。已知從某個節點爬到其父親節點要花費 c 的能量(從父親節點爬到此節點也相同),他們想找出一條花費精力最短的路,以使得搞基的時候精力旺盛,他們找到你要你設計乙個程式來找到這條路,要求你告訴他們最少需要花費多少精力
輸入描述 input description
第一行乙個n,接下來n-1行每一行有三個整數u,v, c 。表示節點 u 爬到節點 v 需要花費 c 的精力。
第n+1行有乙個整數m表示有m次詢問。接下來m行每一行有兩個整數 u ,v 表示兩隻蟲子所在的節點
輸出描述 output description
一共有m行,每一行乙個整數,表示對於該次詢問所得出的最短距離。
樣例輸入 sample input
3 1 0 1
2 0 1
3 1 0
2 0
1 2
樣例輸出 sample output
1 1
2 資料範圍及提示 data size & hint
1<=n<=50000, 1<=m<=75000, 0<=c<=1000
分類標籤 tags
最近公共祖先 圖論
/*
lca模板+帶權最短路.
處理的時候只需把邊權連起來即可.
(dis[u]=dis[v]+e[i].next).
然後套lca模板.
fa陣列開到d+5即可.
*/#include
#include
#include
#define maxn 50001
#define maxm 75001
#define d 21
using
namespace
std;
int n,m,dis[maxn],tot,fa[maxn][d+5],head[maxm],deep[maxn];
struct data
e[maxm<<1];
void add(int u,int v,int x)
void dfs(int u,int x)
}}void get_father()
}int get_same(int u,int v)
int lca(int u,int v)
}if(u==v) return u;
return fa[u][0];
}int main()
dfs(0,0);
get_father();
dis[0]=0;
int u,v;
scanf("%d",&m);
for(int i=1;i<=m;i++)
return
0;}
CODEVS 2370小機房的樹
題目描述description 小機房有棵煥狗種的樹,樹上有n個節點,節點標號為0到n 1,有兩隻蟲子名叫飄狗和大吉狗,分居在兩個不同的節點上。有一天,他們想爬到乙個節點上去搞基,但是作為兩隻蟲子,他們不想花費太多精力。已知從某個節點爬到其父親節點要花費 c 的能量 從父親節點爬到此節點也相同 他們...
CODEVS 2370 小機房的樹
題目描述 description 小機房有棵煥狗種的樹,樹上有n個節點,節點標號為0到n 1,有兩隻蟲子名叫飄狗和大吉狗,分居在兩個不同的節點上。有一天,他們想爬到乙個節點上去搞基,但是作為兩隻蟲子,他們不想花費太多精力。已知從某個節點爬到其父親節點要花費 c 的能量 從父親節點爬到此節點也相同 他...
codevs 2370 小機房的樹
小機房有棵煥狗種的樹,樹上有n個節點,節點標號為0到n 1,有兩隻蟲子名叫飄狗和大吉狗,分居在兩個不同的節點上。有一天,他們想爬到乙個節點上去搞基,但是作為兩隻蟲子,他們不想花費太多精力。已知從某個節點爬到其父親節點要花費 c 的能量 從父親節點爬到此節點也相同 他們想找出一條花費精力最短的路,以使...