Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define f first
- #define s second
- int t,n,deep[10004];
- vector<vector<pair<int,int> > >adj;
- pair<int,int>parent[20][10004];
- string s;
- void dfs(int node,int d){
- deep[node]=d;
- for(int i=0;i<adj[node].size();i++){
- if(!parent[0][adj[node][i].f].f){
- parent[0][adj[node][i].f]=make_pair(node,adj[node][i].s);
- dfs(adj[node][i].f,d+1);
- }
- }
- }
- pair<int,int> KthParent(int x,int k){
- int tem=0;
- if(k==0)
- return make_pair(x,0);
- for(int i=0;i<20;i++){
- if((k>>i)&1){
- tem+=parent[i][x].s;
- x=parent[i][x].f;
- }
- }
- return make_pair(x,tem);
- }
- int lca(int x,int y){
- if(deep[x]<deep[y])
- swap(x,y);
- int k=deep[x]-deep[y];
- for(int i=0;i<20;i++){
- if((k>>i)&1){
- x=parent[i][x].f;
- }
- }
- if(x==y)
- return x;
- for(int i=19;i>=0;i--){
- if(parent[i][x].f!=parent[i][y].f){
- x=parent[i][x].f;
- y=parent[i][y].f;
- }
- }
- return parent[0][x].f;
- }
- int main(){
- cin>>t;
- while(t--){
- memset(deep,0,sizeof deep);
- memset(parent,0,sizeof parent);
- adj.clear();
- cin>>n;
- adj.resize(n+1);
- for(int i=1,u,v,c;i<n;i++){
- scanf("%d%d%d",&u,&v,&c);
- adj[u].push_back(make_pair(v,c));
- adj[v].push_back(make_pair(u,c));
- }
- parent[0][1]=make_pair(1,0);
- dfs(1,0);
- for(int i=1;i<=15;i++){
- for(int j=1;j<=n;j++){
- parent[i][j]=make_pair(parent[i-1][parent[i-1][j].f].f,parent[i-1][parent[i-1][j].f].s+parent[i-1][j].s);
- }
- }
- cout<<' '<<parent[1][4].f<<' '<<parent[1][5].s<<endl;
- cout<<' '<<KthParent(5,1).f<<' '<<KthParent(5,1).s<<endl;
- cout<<' '<<KthParent(5,2).f<<' '<<KthParent(5,2).s<<endl;
- cin>>s;
- int a,b,c,k;
- while(s!="DONE"){
- scanf("%d%d",&a,&b);
- int LCA=lca(a,b);
- if(s=="DIST"){
- int tem=KthParent(a,deep[a]-deep[LCA]).s+KthParent(b,deep[b]-deep[LCA]).s;
- cout<<tem<<endl;
- }else if(s=="KTH"){
- scanf("%d",&c);
- if(c-1<=deep[a]-deep[LCA]){
- cout<<KthParent(a,c-1).f<<endl;
- }else{
- cout<<KthParent(b,deep[b]-deep[LCA]-(c-1-(deep[a]-deep[LCA])) ).f<<endl;
- }
- }
- cin>>s;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement