描述

村里有n个房子和一些双向道路连接。 每天这样的人总是喜欢问“如果我想有多远从房子房子B”? 通常很难回答。 但幸运的是这个村子int答案永远是独一无二的,因为道路建造的方式有一个独特的简单路径(“简单”意味着你不能访问一个地方两次)每两间房子。 你的任务是回答所有这些好奇的人们。

输入

第一行是一个整数T(T < = 10),说明测试用例的数量。
对于每个测试用例,在第一行有两个数n(2 < = n < = 40000)和m(1 < = m < = 200),房屋的数量和查询的数量。 每个组成三个数字我以下n - 1行,j,k,布鲁里溃疡单一空间分离,这意味着有一条路连接房子我和j,k长度(0 < k < = 40000)。 的房子都从1到n的标签。
下一个m线各有不同的整数i和j,你areato回答房子我和房子之间的距离。

输出

对于每个测试用例,输出线。 每一行代表查询的答案。 每个测试用例后输出一个乏味的线。

样例输入

2
3  2
1 2 10
3 15
1 2
2 3

2 - 2
1 2 100
1 2
2 1

样例输出

10
25
100
100
记得 一开始 自己感觉特别难 很容易就超时了 一直不敢写 但是 结果却差好多 不会吵的 邻接表来一发
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<math.h>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define N 40006
int k,y,w[N],t;
int aa[N<<1];
struct node
{
    int f,g,v;
}a[N<<1];
void add(int e,int f,int g)
{
    a[k].f=f;
    a[k].g=g;
    a[k].v=aa[e];
    aa[e]=k++;
}
void bfs(int x,int sum)
{
    if(x==y)
        t=sum;
    if(t!=-1) return ;
    for(int i=aa[x];i!=-1;i=a[i].v)
    {
        int f=a[i].f;
        if(!w[f])
        {
            w[f]=1;
            bfs(f,sum+a[i].g);
        }
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        k=0;
        int n,m,e,f,g;
        memset(aa,-1,sizeof(aa));
        scanf("%d%d",&n,&m);
        for(int i=1;i<n;i++)
        {
            scanf("%d%d%d",&e,&f,&g);
            add(e,f,g);
            add(f,e,g);
        }
        while(m--)
        {
            int x;
            t=-1;
            scanf("%d%d",&x,&y);
            memset(w,0,sizeof(w));
            w[x]=1;
            bfs(x,0);
            printf("%d\n",t);
        }
    }
    return 0;
}

 

posted on 2016-08-23 14:57  云胡不喜。  阅读(268)  评论(0编辑  收藏  举报