显示代码纯文本
- #include<fstream>
- using namespace std;
- ifstream cin("pwalk.in");
- ofstream cout("pwalk.out");
- struct node
- {
- int father,value;
- }tree[1001];
- int n,q;
- int union_find[1001];
- int ask[1001][2];
- bool que[1001][1001];
- int ans[1001][1001];
- int root;
- bool vis[1001];
- int Find(int x)
- {
- if(x==union_find[x])
- {
- return x;
- }
- return Find(union_find[x]);
- }
- void Union(int tar,int get)
- {
- union_find[get]=Find(tar);
- }
- int get_ans(int s,int t,int lca)
- {
- int ret=0;
- while(s!=lca)
- {
- ret+=tree[s].value;
- s=tree[s].father;
- }
- while(t!=lca)
- {
- ret+=tree[t].value;
- t=tree[t].father;
- }
- return ret;
- }
- void tarjan(int r)
- {
- for(int i=1;i<=n;i++)
- {
- if(tree[i].father==r)
- {
- tarjan(i);
- Union(r,i);
- vis[i]=true;
- }
- }
- for(int i=1;i<=1000;i++)
- {
- if(que[r][i])
- {
- if(vis[i])
- {
- int lca=Find(i);
- ans[r][i]=ans[i][r]=get_ans(r,i,lca);
- }
- }
- }
- return;
- }
- int main()
- {
- cin>>n>>q;
- for(int i=1;i<n;i++)
- {
- union_find[i]=i;
- int u,v,val;
- cin>>u>>v>>val;
- tree[u].father=v;
- tree[u].value=val;
- }
- union_find[n]=n;
- for(int i=1;i<=n;i++)
- {
- if(!tree[i].father)
- {
- root=i;
- }
- }
- for(int i=1;i<=q;i++)
- {
- int p1,p2;
- cin>>p1>>p2;
- ask[i][0]=p1;
- ask[i][1]=p2;
- que[p1][p2]=que[p2][p1]=true;
- }
- tarjan(root);
- for(int i=1;i<=q;i++)
- {
- cout<<ans[ask[i][0]][ask[i][1]]<<endl;
- }
- cin.close();
- cout.close();
- return 0;
- }