#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
int n,ans,k;
int vis[100010];
int son[100010];
struct node
{
int a,b,c;
};
vector<node> vec[100010];
int solve_son_size(int v,int fa)
{
int c=1;
for(int i=0;i<vec[v].size();i++)
{
node p=vec[v][i];
if(p.b!=fa&&!vis[p.b])
{
c+=solve_son_size(p.b,v);
}
}
son[v]=c;
return c;
}
pair<int,int> search_centroid(int v,int fa,int t)
{
pair<int,int> res=make_pair(INF,-1);
int s=1,m=0;
for(int i=0;i<vec[v].size();i++)
{
node p=vec[v][i];
if(p.b!=fa&&!vis[p.b])
{
res=min(res,search_centroid(p.b,v,t));
m=max(m,son[p.b]);
s+=son[p.b];
}
}
m=max(m,t-s);
res=min(res,make_pair(m,v));
return res;
}
void v_dis(int v,int fa,int c,vector<int> &tds)
{
tds.push_back(c);
for(int i=0;i<vec[v].size();i++)
{
node p=vec[v][i];
if(p.b!=fa&&!vis[p.b])
{
v_dis(p.b,v,c+p.c,tds);
}
}
}
int count_pair(vector<int> &ds)
{
int res=0;
sort(ds.begin(),ds.end());
int len=ds.size();
for(int i=0;i<ds.size();i++)
{
while(len>0&&ds[i]+ds[len-1]>k)
len--;
res+=len-(len>i?1:0);
}
return res/2;
}
void solve_son(int v)
{
solve_son_size(v,-1);
int s=search_centroid(v,-1,son[v]).second;
vis[s]=1;
for(int i=0;i<vec[s].size();i++)
{
node p=vec[s][i];
if(!vis[p.b])
{
solve_son(p.b);
}
}
vector<int> ds;
ds.push_back(0);
for(int i=0;i<vec[s].size();i++)
{
node p=vec[s][i];
if(!vis[p.b])
{
vector<int>tds;
v_dis(p.b,s,p.c,tds);
ans-=count_pair(tds);
ds.insert(ds.end(),tds.begin(),tds.end());
}
}
ans+=count_pair(ds);
vis[s]=0;
}
int main()
{
while(1)
{
int m,a,b,c;
scanf("%d%d",&n,&k);
if(n==0&&k==0)
break;
m=n-1;
for(int i=0;i<=n;i++)
vec[i].clear();
memset(vis,0,sizeof(vis));
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
node p1,p2;
p1.b=b-1,p1.c=c;
p2.b=a-1,p2.c=c;
vec[a-1].push_back(p1);
vec[b-1].push_back(p2);
}
ans=0;
solve_son(0);
printf("%d\n",ans);
}
return 0;
}
树重心分解,求点对。
最新推荐文章于 2022-12-14 10:20:10 发布