测试数据过了,但是WRONG ANSEWER。错哪里了??
程序代码:
#include<iostream>
#include<cmath>
using namespace std;
const int maxn=10000+5;
int tol=0,n,m;
int map[maxn][maxn];
int f[maxn][3];
int deep[maxn]; //第i点在树中的深度
int dist[maxn]; //第i点离树的根节点的距离
int p[maxn][15]; //第i点的2^j父亲
void init()
{
cin>>n>>m;
for (int i=1;i<n;i++)
{
int x,y,z;
cin>>x>>y>>z;
map[x][++map[x][0]]=y;
map[y][++map[y][0]]=x;
f[i][0]=x;f[i][1]=y;f[i][2]=z;
}
}
void build(int x,int d)
{
deep[x]=d++;//记录深度
for (int i=1;i<=map[x][0];i++)
{
if (deep[map[x][i]]!=0) continue;
p[map[x][i]][0]=x;
for (int j=1;j<n;j++)
if (f[j][0]==x && f[j][1]==map[x][i]
|| f[j][0]==map[x][i] && f[j][1]==x)
{
dist[map[x][i]]=dist[x]+f[j][2];
break;
}
if (map[map[x][i]][0]==1) continue;
build(map[x][i],d);
}
}
void tree()
{
//设根节点为点1并建树
dist[1]=0;
build(1,1);
}
void find()
{
//预处理
for (int i=2;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
int a=(int)pow(2,(double)j);
if (a>deep[i]) break;
p[i][j]=p[p[i][j-1]][j-1];
}
}
}
int solve(int x,int y)
{
if (deep[x]>deep[y]) {int z=x; x=y; y=z;}
int j=14;
while (deep[x]<deep[y])
{
while (deep[y]-(1<<j)<deep[x]) j--;
y=p[y][j];
}
j=14;
while (x!=y)
{
while (j>0 && (deep[x]-(1<<j)<0 || p[x][j]==p[y][j])) j--;
x=p[x][j];
y=p[y][j];
}
}
void doit()
{
for (int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
int com=solve(x,y);
cout<<dist[x]-dist[com]+dist[y]-dist[com]<<endl;
}
}
int main()
{
init();
tree();
find();
doit();
return 0;
}