参考上一篇文章。这题建图有点不知道怎么下手,稀里糊涂也过了。
现在想想Tarjan离线就是DFS+并查集,不难
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define M 40001
#define Q 200
int n, q;
typedef struct _Node{
int dis;
int v;
struct _Node* next;
}Node, *pNode;
pNode map[M];
int len[M];
typedef struct _Query{
int s, e;
int ans;
}Query, *pQuery;
Query que[Q];
int set[M];
int mk[M];
void init(){
int i;
for(i=1; i<=n; i++){
set[i] = i;
}
}
int find(int u){
if(set[u]!=u){
set[u] = find(set[u]);
}
return set[u];
}
void combine(int u, int v){
set[v] = u;
}
void LCA(int u){
int i, t;
pNode r=map[u];
while(r && !mk[r->v]){
len[r->v] = len[u] + r->dis;
LCA(r->v);
combine(u, r->v);
r = r->next;
}
mk[u] = 1;
for(i=0; i<q; i++){
t = -1;
if(u==que[i].s && mk[que[i].e])
t = que[i].e;
else if(u==que[i].e && mk[que[i].s])
t = que[i].s;
if(t!=-1)
que[i].ans = find(t);
}
}
void clean(){
int i;
pNode t;
for(i=0; i<n; i++){
while(map[i]){
t = map[i];
map[i] = t->next;
free(t);
}
}
}
void main(){
int c, i;
int u, v, dis;
pNode t;
freopen("in.txt", "r", stdin);
scanf("%d", &c);
while(c--){
scanf("%d %d", &n, &q);
memset(map, 0, sizeof(map));
for(i=0; i<n-1; i++){
scanf("%d %d %d", &u, &v, &dis);
if(v<u) u ^= v ^= u ^= v;
t = (pNode)malloc(sizeof(Node));
t->dis = dis;
t->v = v;
t->next = map[u];
map[u] = t;
}
for(i=0; i<q; i++){
scanf("%d %d", &(que[i].s), &(que[i].e));
}
memset(len, 0x7F, sizeof(len));
memset(mk, 0, sizeof(mk));
init();
len[1] = 0;
LCA(1);
for(i=0; i<q; i++){
printf("%d\n", len[que[i].s]+len[que[i].e]-2*len[que[i].ans]);
}
clean();
}
}