记录编号 303295 评测结果 AAAAAAAAAA
题目名称 距离 最终得分 100
用户昵称 GravatarGROWL GOOD BOYส็ 是否通过 通过
代码语言 C++ 运行时间 0.297 s
提交时间 2016-09-05 10:05:53 内存使用 1.62 MiB
显示代码纯文本
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector> 
 
using namespace std;
 
const int maxn=20000+100;
 
int fa[maxn];
 
int dist[maxn],colr[maxn];
 
 
int Ans[maxn*2];
 
vector<int> Ask[maxn];
vector<int> g[maxn];
vector<int> ord[maxn];
vector<int> dis[maxn];
 
int N,M;
 
int Find(int x)
{
    int fx=x,zh;
    while(fa[fx]!=fx)
    {fx=fa[fx];}
    while(fa[x]!=fx)
    {
     zh=fa[x],fa[x]=fx,x=zh;
    }
    return fx;
}
 
void DFS(int x)
{
     colr[x]=1;fa[x]=x;
     int len=g[x].size();
     for(int t,d,i=0;i<len;i++)
     {
             t=g[x][i];
             d=dis[x][i];
             if(!colr[t])
             {
                 //vis[t]=1;
                 dist[t]=dist[x]+d;
                 DFS(t); 
                 fa[t]=x;
             }
     }
     int len1=Ask[x].size();
     for(int t,pos,i=0;i<len1;i++)
     {
             t=Ask[x][i];pos=ord[x][i];
             if(colr[t]==-1)
             {
               Ans[pos]=dist[x]+dist[t]-2*dist[Find(t)];
             }
     }
     colr[x]=-1;
}
int main()
{
    freopen("distance.in","r",stdin);
    freopen("distance.out","w",stdout);
    scanf("%d%d",&N,&M);
    //for(int i=1;i<=N;i++)fa[i]=i;
    for(int x,y,z,i=1;i<N;i++)
    {
    scanf("%d%d%d",&x,&y,&z);
    g[x].push_back(y);
    g[y].push_back(x);
    dis[x].push_back(z);
    dis[y].push_back(z);
    }
    for(int s,t,i=1;i<=M;i++)
    {
            scanf("%d%d",&s,&t);
            Ask[s].push_back(t);
            ord[s].push_back(i);
            Ask[t].push_back(s);
            ord[t].push_back(i);
    }
    dist[1]=0;
    DFS(1);
    for(int i=1;i<=M;i++)printf("%d\n",Ans[i]);
    fclose(stdin);
    fclose(stdout);
    return 0;
}