Pregunta: Hay k puntos especiales en un árbol con n puntos. Pregunte el número de puntos a que cumplen las siguientes condiciones:
(1) La distancia a un punto especial b es menor que la distancia desde puntos distintos de a, b ab
(2) La distancia a un punto especial c es menor que la distancia de b a c
Idea: Encuentre el número de puntos en el camino entre dos puntos especiales
#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;
}