D - Transit Tree Path

D - Transit Tree Path


Time limit : 2sec / Memory limit : 256MB

Score : 400 points

Problem Statement

You are given a tree with N vertices.
Here, a tree is a kind of graph, and more specifically, a connected undirected graph with N1 edges, where N is the number of its vertices.
The i-th edge (1iN1) connects Vertices ai and bi, and has a length of ci.

You are also given Q queries and an integer K. In the j-th query (1jQ):

  • find the length of the shortest path from Vertex xj and Vertex yj via Vertex K.

Constraints

  • 3N105
  • 1ai,biN(1iN1)
  • 1ci109(1iN1)
  • The given graph is a tree.
  • 1Q105
  • 1KN
  • 1xj,yjN(1jQ)
  • xjyj(1jQ)
  • xjK,yjK(1jQ)

Input

Input is given from Standard Input in the following format:

N  
a1 b1 c1  
:  
aN1 bN1 cN1
Q K
x1 y1
:  
xQ yQ

Output

Print the responses to the queries in Q lines.
In the j-th line j(1jQ), print the response to the j-th query.


Sample Input 1

5
1 2 1
1 3 1
2 4 1
3 5 1
3 1
2 4
2 3
4 5

Sample Output 1

3
2
4

The shortest paths for the three queries are as follows:

  • Query 1: Vertex 2 → Vertex 1 → Vertex 2 → Vertex 4 : Length 1+1+1=3
  • Query 2: Vertex 2 → Vertex 1 → Vertex 3 : Length 1+1=2
  • Query 3: Vertex 4 → Vertex 2 → Vertex 1 → Vertex 3 → Vertex 5 : Length 1+1+1+1=4

Sample Input 2

7
1 2 1
1 3 3
1 4 5
1 5 7
1 6 9
1 7 11
3 2
1 3
4 5
6 7

Sample Output 2

5
14
22

The path for each query must pass Vertex K=2.


Sample Input 3

10
1 2 1000000000
2 3 1000000000
3 4 1000000000
4 5 1000000000
5 6 1000000000
6 7 1000000000
7 8 1000000000
8 9 1000000000
9 10 1000000000
1 1
9 10

Sample Output 3

17000000000

linux有毒啊,昨天就写好了,一直说我编译不通过,找了好久都不知道怎么回事,早上就直接交一次,就过了,
什么情况啊,貌似他一直说我的v[x].push_back({y,z});这样写不能通过编译,哭死.
这个就是树啦,然后就用dfs就成了,代码挺短的,但是看到别人的怎么要差不多100行,可怕.
 1 #include <bits/stdc++.h>
 2 #define mem(a) memset(a,0,sizeof(a))
 3 #define N 100010
 4 #define ll long long int
 5 using namespace std;
 6 ll an[N];
 7 struct Node{
 8   int to;
 9   ll cost;
10 };
11 vector<Node> v[N];
12 void dfs(int x,int fa){
13   for(int i=0;i<v[x].size();i++){
14     if(v[x][i].to==fa)
15       continue;
16     an[v[x][i].to]=an[x]+v[x][i].cost;
17     dfs(v[x][i].to,x);
18   }
19 }
20 int main(){
21   int n;
22   scanf("%d", &n);
23   int x,y;
24   ll z;
25   for(int i=1;i<n;i++){
26     scanf("%d%d%lld",&x,&y,&z);
27     v[x].push_back({y,z});
28     v[y].push_back({x,z});
29   }
30   int q,t;
31   scanf("%d%d",&q,&t);
32   dfs(t,-1);
33   while(q--){
34     scanf("%d%d",&x,&y);
35     printf("%lld\n",an[x]+an[y]);
36   }
37   return 0;
38 }
posted @ 2017-08-14 11:19  #忘乎所以#  阅读(173)  评论(0编辑  收藏  举报