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 N−1 edges, where N is the number of its vertices.
The i-th edge (1≤i≤N−1) 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 (1≤j≤Q):
- find the length of the shortest path from Vertex xj and Vertex yj via Vertex K.
Constraints
- 3≤N≤105
- 1≤ai,bi≤N(1≤i≤N−1)
- 1≤ci≤109(1≤i≤N−1)
- The given graph is a tree.
- 1≤Q≤105
- 1≤K≤N
- 1≤xj,yj≤N(1≤j≤Q)
- xj≠yj(1≤j≤Q)
- xj≠K,yj≠K(1≤j≤Q)
Input
Input is given from Standard Input in the following format:
N
a1 b1 c1
:
aN−1 bN−1 cN−1
Q K
x1 y1
:
xQ yQ
Output
Print the responses to the queries in Q lines.
In the j-th line j(1≤j≤Q), 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 ",an[x]+an[y]); 36 } 37 return 0; 38 }