标签:nod sizeof clu ios || inf string ffffff str
poj 1741
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
using std::sort;
using std::max;
const int maxn=10100;
const int inf=0x7fffffff;
struct node
{
int p;
int v;
int nxt;
};
node line[maxn<<1];
int head[maxn],tail;
int f[maxn],size[maxn],dep[maxn],d[maxn],vis[maxn],tot;
int ans,sum,root;
int n,k;
void add(int a,int b,int c)
{
line[++tail].p=b;
line[tail].v=c;
line[tail].nxt=head[a];
head[a]=tail;
return ;
}
void init()
{
memset(vis,0,sizeof(f));
memset(head,0,sizeof(head));
tail=0;ans=0;
//memset(f,0,sizeof(f));
//memset(size,0,sizeof(f));
}
void get_hry(int now,int fa)
{
f[now]=0;size[now]=1;
int v;
for(int i=head[now];i;i=line[i].nxt)
{
v=line[i].p;
if(v==fa||vis[v]) continue;
get_hry(v,now);
size[now]+=size[v];
f[now]=max(f[now],size[v]);
}
f[now]=max(f[now],sum-size[now]);
if(f[root]>f[now]) root=now;
return ;
}
void get_dep(int now,int fa)
{
int v;d[++tot]=dep[now];
size[now]=1;
for(int i=head[now];i;i=line[i].nxt)
{
v=line[i].p;
if(v==fa||vis[v]) continue;
dep[v]=dep[now]+line[i].v;
get_dep(v,now);
size[now]+=size[v];
}
return ;
}
int calc(int now,int v)
{
tot=0;dep[now]=v;
get_dep(now,0);
int l=1,r=tot,res=0;
sort(d+1,d+tot+1);
while(l<r)
{
if(d[l]+d[r]<=k)
{
res+=r-l;
l++;
}
else
r--;
}
return res;
}
void solve(int now)
{
vis[now]=1;
ans+=calc(now,0);
int v;
for(int i=head[now];i;i=line[i].nxt)
{
v=line[i].p;
if(vis[v]) continue;
ans-=calc(v,line[i].v);
root=0;sum=size[v];
get_hry(v,0);
solve(root);
}
return ;
}
int main()
{
while(true)
{
scanf("%d%d",&n,&k);
if(!n||!k) break;
for(int i=1,a,b,c;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
f[0]=inf;sum=n;
get_hry(1,0);
solve(root);
printf("%d\n",ans);
init();
}
return 0;
}
标签:nod sizeof clu ios || inf string ffffff str
原文地址:https://www.cnblogs.com/Lance1ot/p/10245850.html