题意:一棵n个点的树上有k个特殊点,问满足以下条件的点a的个数:
(1)到某个特殊点b的距离小于除a, b外的点到b的距离
(2)到某个特殊点c的距离小于b到c的距离
思路:求任意两个特殊点之间路径上点的个数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const int N = 1e5 + 7;
vector<int>mp[N];
int n, k;
bool vis[N], is[N];
bool dfs(int u, int fa) {
bool flag = 0;
int siz = mp[u].size();
for(int i = 0; i < siz; ++i) {
int v = mp[u][i];
if(v == fa) continue;
if(dfs(v, u) || vis[v]) is[v] = 1, flag = 1;
}
if(flag) is[u] = 1;
return is[u];
}
int main() {
int u, v, w;
scanf("%d%d", &n, &k);
for(int i = 1; i < n; ++i) {
scanf("%d%d%d", &u, &v, &w);
mp[u].emplace_back(v);
mp[v].emplace_back(u);
}
for(int i = 1; i <= k; ++i) {
scanf("%d", &u);
vis[u] = 1;
}
int cnt = 0;
for(int i = 1; i <= n; ++i) {
if(vis[i]) {
dfs(i, 0);
break;
}
}
for(int i = 1; i <= n; ++i) if(is[i] || vis[i]) cnt++;
printf("%d\n", cnt);
return 0;
}