这么写时间复杂度是什么啊?
#include<bits/stdc++.h>
using namespace std;
int n,m,u,v,w,q[100005],root,Max[100005],sum,siz[100005],dis[100005],cnt,nod[100005];
long long ans,check[20005],vis[100005],res[100005];
queue<int>tag;
struct node{
int to,dis;
};
vector<node>ve[100005];
node Node(int x,int y){
node res;
res.to=x,res.dis=y;
return res;
}
void dfs1(int now,int fa){
siz[now]=1;
Max[now]=0;
for(int i=0;i<ve[now].size();i++){
int y=ve[now][i].to;
if(y==fa||vis[y])continue;
dfs1(y,now);
Max[now]=max(Max[now],siz[y]);
siz[now]+=siz[y];
}
Max[now]=max(Max[now],sum-siz[now]);
if(Max[now]<Max[root])root=now;
}
void dfs3(int now,int fa){
nod[++cnt]=dis[now];
for(int i=0;i<ve[now].size();i++){
int y=ve[now][i].to;
if(y==fa||vis[y])continue;
dis[y]=dis[now]+ve[now][i].dis;
dfs3(y,now);
}
}
void dfs2(int now,int fa){
check[0]++;
tag.push(0);
vis[now]=1;
for(int i=0;i<ve[now].size();i++){
int y=ve[now][i].to;
if(y==fa||vis[y])continue;
dis[y]=ve[now][i].dis;
dfs3(y,now);
for(int j=1;j<=cnt;j++)
for(int k=nod[j];k<=m;k++)res[k]+=check[q[k]-nod[j]];
for(int j=1;j<=cnt;j++)if(nod[j]<=20005)tag.push(nod[j]),check[nod[j]]++;
cnt=0;
}
while(!tag.empty())check[tag.front()]--,tag.pop();
for(int i=0;i<ve[now].size();i++){
int y=ve[now][i].to;
if(y==fa||vis[y])continue;
sum=siz[y],root=0,Max[0]=2e9;
dfs1(y,now);
dfs1(root,0);
dfs2(root,now);
}
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
cin>>u>>v>>w;
ve[u].push_back(Node(v,w));
ve[v].push_back(Node(u,w));
}
cin>>m;
for(int i=0;i<=m;i++)q[i]=i;
Max[0]=2e9,sum=n;
dfs1(1,0);
dfs1(root,0);
dfs2(root,0);
for(int i=0;i<=m;i++)ans+=res[i];
cout<<ans<<endl;
}