How far away ?
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10312 Accepted Submission(s): 3743
Problem Description
There
are n houses in the village and some bidirectional roads connecting
them. Every day peole always like to ask like this "How far is it if I
want to go from house A to house B"? Usually it hard to answer. But
luckily int this village the answer is always unique, since the roads
are built in the way that there is a unique simple path("simple" means
you can't visit a place twice) between every two houses. Yout task is to
answer all these curious people.
Input
First line is a single integer T(T<=10), indicating the number of test cases.
For each test case,in the first line there are two numbers n(2<=n<=40000) and m (1<=m<=200),the number of houses and the number of queries. The following n-1 lines each consisting three numbers i,j,k, separated bu a single space, meaning that there is a road connecting house i and house j,with length k(0<k<=40000).The houses are labeled from 1 to n.
Next m lines each has distinct integers i and j, you areato answer the distance between house i and house j.
For each test case,in the first line there are two numbers n(2<=n<=40000) and m (1<=m<=200),the number of houses and the number of queries. The following n-1 lines each consisting three numbers i,j,k, separated bu a single space, meaning that there is a road connecting house i and house j,with length k(0<k<=40000).The houses are labeled from 1 to n.
Next m lines each has distinct integers i and j, you areato answer the distance between house i and house j.
Output
For each test case,output m lines. Each line represents the answer of the query. Output a bland line after each test case.
Sample Input
2
3 2
1 2 10
3 1 15
1 2
2 3
2 2
1 2 100
1 2
2 1
Sample Output
10
25
100
100
#include <bits/stdc++.h> using namespace std ; const int N = 100010 ; typedef pair<int,int> pii ; #define X first #define Y second int n , m ; int eh[N] , nxt[N<<1] , et[N<<1] , ew[N<<1] , tot ; int fa[N] , vis[N] , anc[N] ; int ux[N] , vx[N] , wx[N] ; vector<pii>qry[N] ; void init() { for( int i = 0 ; i <= n ; ++i ) { qry[i].clear() ; vis[i] = 0 ; } tot = 0 ; memset( eh , -1 , sizeof eh ) ; } void addedge( int u , int v , int w ) { et[tot] = v , nxt[tot] = eh[u] , ew[tot] = w , eh[u] = tot++ ; } int find(int x){ return fa[x] = ( fa[x]==x?x:find(fa[x]));} void un( int x , int y ) { x = find(x); y = find(y); if(x==y)return ; fa[y]=x; } void dfs1( int u , int pre ) { vis[u] = 1 ; fa[u] = u ; for( int i = eh[u] ; ~i ; i = nxt[i] ) { int v = et[i] ; if( v == pre ) continue ; dfs1( v , u ) ; un( u , v ); } int siz = qry[u].size() ; for( int i = 0 ; i < siz ; ++i ) { if( vis[qry[u][i].X] ) { anc[qry[u][i].Y] = find( qry[u][i].X ); } } } int dis[N] ; void dfs2( int u , int pre , int d ) { dis[u] = d ; for( int i = eh[u] ; ~i ; i = nxt[i] ) { int v = et[i] ; if( v == pre ) continue ; dfs2( v , u , d + ew[i] ) ; } } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif // LOCAL int _ ; scanf("%d",&_) ; while( _-- ) { scanf("%d%d",&n,&m) ; init() ; for( int i = 1 ; i < n ; ++i ) { int u , v , w ; scanf("%d%d%d",&u,&v,&w) ; addedge( u , v , w ) ; addedge( v , u , w ) ; } for( int i = 0 ; i < m ; ++i ) { scanf("%d%d",&ux[i],&vx[i]) ; qry[ ux[i] ].push_back( pii( vx[i] , i ) ) ; qry[ vx[i] ].push_back( pii( ux[i] , i ) ) ; } dfs1( 1 , 0 ) ; dfs2( 1 , 0 , 0 ) ; for( int i = 0 ; i < m ; ++i ) { printf("%d ",dis[ux[i]]+dis[vx[i]]-2*dis[anc[i]]); } } return 0 ; }