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.
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
题意:给一个无向图连通两点的经过k点的最短的路径是多少;
n个点n-1条边一定是棵树,只要dfs以k为根的树就行了..
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef vector< pair<ll,ll> > Root;
Root root[1000005];
ll L[1000005];
void dfs(ll r,ll fa,ll sum)
{
L[r]=sum;
for(int i=0;i<root[r].size();i++)
{
if(root[r][i].first==fa) continue;
dfs(root[r][i].first,r,root[r][i].second+sum);
}
}
int main(void)
{
int n;
cin>>n;
for(int i=1;i<n;i++)
{
ll a,b,val;
cin>>a>>b>>val;
root[a].push_back(make_pair(b,val));
root[b].push_back(make_pair(a,val));
}
ll que,k;
cin>>que>>k;
dfs(k,-1,0);
while(que--)
{
ll a,b;
cin>>a>>b;
cout<<L[a]+L[b]<<endl;
}
return 0;
}