描述
村里有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; }
时间: 2024-11-14 13:07:29