题目链接:http://acm.fzu.edu.cn/problem.php?pid=2082
wushen博客:wuyiqi
思路:
边权转点权:
由于线段树中的点是节点,则把题目给的边权值作为 边一端 距离根更远的节点的点权值。
直接设置根权值为0 这样不会影响题意。
因为求的的是两点间所有的点权和,所以要减去 LCA(u,v),因为这个点所代表的边是没有在路径上的。
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#define N 50050
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define Mid(x,y) ((x+y)>>1)
#define ll __int64
struct Edge{
ll from, to, dis,nex;
bool yes;
}edge[N<<1];
ll head[N], edgenum;
ll dis[N];
void addedge(ll u, ll v, ll d){
Edge E={u,v,d,head[u],false};
edge[edgenum] = E;
head[u]