题目:http://poj.org/problem?id=1987
题意:和POJ 1741基本一样
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 50010;
struct edge
{
int to, val, next;
}g[N*2];
int head[N], siz[N], sonsiz[N], dis[N];
bool vis[N];
int n, m, k, cnt, num, res, tmp, root;
void add_edge(int v, int u, int val)
{
g[cnt].to = u;
g[cnt].val = val;
g[cnt].next = head[v];
head[v] = cnt++;
}
void dfssiz(int v, int fa)
{
siz[v] = 1, sonsiz[v] = 0;
for(int i = head[v]; i != -1; i = g[i].next)
{
int u = g[i].to;
if(u != fa && !vis[u])
{
dfssiz(u, v);
siz[v] += siz[u];
sonsiz[v] = max(sonsiz[v], siz[u]);
}
}
}
void dfsroot(int r, int v, int fa)
{
sonsiz[v] = max(sonsiz[v], siz[r] - siz[v]);
if(sonsiz[v] < tmp) tmp = sonsiz[v], root = v;
for(int i = head[v]; i != -1; i = g[i].next)
{
int u = g[i].to;
if(u != fa && !vis[u]) dfsroot(r, u, v);
}
}
void dfsdis(int v, int d, int fa)
{
dis[num++] = d;
for(int i = head[v]; i != -1; i = g[i].next)
{
int u = g[i].to;
if(u != fa && !vis[u]) dfsdis(u, d + g[i].val, v);
}
}
int calc(int v, int d)
{
int ans = 0;
num = 0;
dfsdis(v, d, 0);
sort(dis, dis + num);
int i = 0, j = num - 1;
while(i < j)
{
while(dis[i] + dis[j] > k && i < j) j--;
ans += j - i;
i++;
}
return ans;
}
void dfs(int v)
{
tmp = n;
dfssiz(v, 0);
dfsroot(v, v, 0);
res += calc(root, 0);
vis[root] = true;
for(int i = head[root]; i != -1; i = g[i].next)
{
int u = g[i].to;
if(! vis[u])
{
res -= calc(u, g[i].val);
dfs(u);
}
}
}
int main()
{
int a, b, c;
char ch;
scanf("%d%d", &n, &m);
cnt = res = 0;
memset(head, -1, sizeof head);
memset(vis, 0, sizeof vis);
for(int i = 0; i < n - 1; i++)
{
scanf("%d%d%d %c", &a, &b, &c, &ch);
add_edge(a, b, c);
add_edge(b, a, c);
}
scanf("%d", &k);
dfs(1);
printf("%d\n", res);
return 0;
}