【POJ】1741 Tree

来源:互联网 发布:调用接口获取json数据 编辑:程序博客网 时间:2024/04/20 18:41

传送门:http://poj.org/problem?id=1741

点分裸题
感谢zw+1……

#include<stdio.h>#include<algorithm>#include<cstring>#define Push(a,b,c) push(a,b,c),push(b,a,c)#define cint const int &#define ___ cint u,cint f=0#define V e[_].v#define For for (int _=s[u];_;_=e[_].n) if (V!=f && !vis[V])using namespace std;#define N 10005int tot,s[N],dn[N],dis[N],st[N],key[N],ed,sum,C,ans,n,K;bool vis[N];struct edge{int v,c,n;}e[N<<1];inline void push(cint u,cint v,cint c){e[++tot]=(edge){v,c,s[u]};s[u]=tot;}void dfs(___){dn[u]=1;For dfs(V,u),dn[u]+=dn[V];}void find(___){    key[u]=sum-dn[u];    For find(V,u),key[u]=max(key[u],dn[V]);    if (key[u]<key[C]) C=u;}void getd(___){For dis[V]=dis[u]+e[_].c,getd(V,u);}void ins(___){st[++ed]=dis[u];For ins(V,u);}inline int gets(cint u){    ed=0;    ins(u);    int rt=0,p2=ed;    sort(st+1,st+ed+1);    for (int p1=1;p1<p2;p1++)    {        while (K<st[p1]+st[p2] && p1<p2) p2--;        rt+=p2-p1;    }    return rt;}void solve(___){    vis[u]=1;dis[u]=0;    getd(u);    ans+=gets(u);    For ans-=gets(V);    For dfs(V),sum=dn[V],C=0,find(V),solve(C);}inline void prepare(){    key[0]=n+1;    tot=ans=0;    memset(s,0,n+2<<2);    memset(vis,0,n+2);}int main(){    while (scanf("%d%d",&n,&K),n)    {        prepare();        for (int i=1,u,v,c;i<n;i++) scanf("%d%d%d",&u,&v,&c),Push(u,v,c);        solve(1);        printf("%d\n",ans);    }}
0 0
原创粉丝点击