博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2586 How far away ? ( 离线 LCA , tarjan )
阅读量:6803 次
发布时间:2019-06-26

本文共 3469 字,大约阅读时间需要 11 分钟。

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.
 

 

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 
using namespace std ;const int N = 100010 ;typedef pair
pii ;#define X first#define Y secondint 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
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\n",dis[ux[i]]+dis[vx[i]]-2*dis[anc[i]]); } } return 0 ;}
View Code

 

转载于:https://www.cnblogs.com/hlmark/p/5137549.html

你可能感兴趣的文章
http上传文件深度解析-高性能http传输
查看>>
Linux下配置Java环境变量
查看>>
HTTP State Management Mechanism(HTTP 状态管理机制)
查看>>
IOS之禁用UIWebView的默认交互行为
查看>>
绩效管理功能扩展包
查看>>
我的友情链接
查看>>
Android:NDK、JNI
查看>>
dl,dt,dd标记在网页中要充分利用
查看>>
Oracle非常规恢复(使用BBED跳过归档)
查看>>
c# 的四舍五入
查看>>
Java程序员从笨鸟到菜鸟之(七十二)细谈Spring(四)利用注解实现spring基本配置详解...
查看>>
Iperf带宽大小和TCP窗口测试
查看>>
linux命令总结-ls
查看>>
2013 SharePoint复习 -- CA之Application Management
查看>>
Nginx perl fcgi 配置
查看>>
我的友情链接
查看>>
java多态深入理解(二)
查看>>
利用node.js和mongodb为你的app写一个web服务
查看>>
Rails 3 Authlogic: Could not find generator ses...
查看>>
iOS静态库的那些坑
查看>>