标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6727 Accepted Submission(s): 2497
#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <string.h> #include <stdio.h> #include <vector> using namespace std; using namespace std; const int maxn=50010; vector<int> v[maxn],w[maxn],query[maxn],num[maxn]; int tt,n,m,dist[maxn],ans[maxn],fa[maxn]; bool vis[maxn]; void init() { for(int i=1;i<=n;i++) { fa[i]=i; v[i].clear(); w[i].clear(); query[i].clear(); num[i].clear(); dist[i]=0; vis[i]=0; ans[i]=0; } } int find(int x) { if(x!=fa[x]) fa[x]=find(fa[x]); return fa[x]; } void Union(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) fa[fy]=fx; } void tarjan(int cur,int val) { vis[cur]=1; dist[cur]=val; for(int i=0;i<v[cur].size();i++) { int temp=v[cur][i]; if(vis[temp]) continue; tarjan(temp,val+w[cur][i]); Union(cur,temp); } for(int i=0;i<query[cur].size();i++) { int temp=query[cur][i]; if(!vis[temp]) continue; ans[num[cur][i]]=dist[cur]+dist[temp]-2*dist[find(temp)]; } } int main() { int x,y,z; scanf("%d",&tt); while(tt--) { scanf("%d%d",&n,&m); init(); for(int i=0;i<n-1;i++) { scanf("%d%d%d",&x,&y,&z); v[x].push_back(y); v[y].push_back(x); w[x].push_back(z); w[y].push_back(z); } for(int i=0;i<m;i++) { scanf("%d%d",&x,&y); query[x].push_back(y); query[y].push_back(x); num[x].push_back(i); num[y].push_back(i); } tarjan(1,0); for(int i=0;i<m;i++) printf("%d\n",ans[i]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/a972290869/p/4372951.html