hdu----(2586)How far away ?(DFS/LCA/RMQ)
How far away ?
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5492 Accepted Submission(s): 2090
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
Source
Recommend
用邻接表+dfs比较容易过...
代码:
1 #include<cstring> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<vector> 5 #include<algorithm> 6 #include<iostream> 7 using namespace std; 8 const int maxn=40100; 9 struct node 10 { 11 int id,val; 12 }; 13 bool vis[maxn]; 14 vector< node >map[maxn]; 15 node tem; 16 int n,m,ans,cnt; 17 void dfs(int a,int b) 18 { 19 20 if(a==b){ 21 if(ans>cnt)ans=cnt; 22 return ; 23 } 24 int Size=map[a].size(); 25 vis[a]=1; 26 for(int i=0;i<Size;i++){ 27 if(!vis[map[a][i].id]){ 28 cnt+=map[a][i].val; 29 dfs(map[a][i].id,b); 30 cnt-=map[a][i].val; 31 } 32 } 33 vis[a]=0; 34 } 35 int main() 36 { 37 int cas,a,b,val; 38 cin>>cas; 39 while(cas--){ 40 cin>>n>>m; 41 cnt=0; 42 for(int i=1;i<=n;i++) 43 map[i].clear(); 44 for(int i=1;i<n;i++){ 45 scanf("%d%d%d",&a,&b,&val); 46 47 tem=(node){b,val}; 48 map[a].push_back(tem); //ÎÞÏòͼ 49 tem=(node){a,val}; 50 map[b].push_back(tem); 51 } 52 for(int i=0;i<m;i++) 53 { 54 ans=0x3f3f3f3f; 55 scanf("%d%d",&a,&b); 56 dfs(a,b); 57 printf("%d\n",ans); 58 } 59 } 60 return 0; 61 }
编程是一种快乐,享受代码带给我的乐趣!!!