import
java.io.*;
import
java.util.*;
class
Solution {
int
[] dp1, dp2;
Solution()
{
dp1 =
new
int
[
100005
];
dp2 =
new
int
[
100005
];
Arrays.fill(dp1, -
1
);
Arrays.fill(dp2, -
1
);
}
public
int
findAnnouncementNodes(
int
n,
int
m,
List<Integer> canBeHeardFrom,
int
d, List<List<Integer> > edges)
{
List<List<Integer> > adj =
new
ArrayList<>();
for
(
int
i =
0
; i <= n +
5
; i++) {
adj.add(
new
ArrayList<Integer>());
}
HashSet<Integer> hs
=
new
HashSet<Integer>(canBeHeardFrom);
for
(List<Integer> e : edges) {
int
u = e.get(
0
);
int
v = e.get(
1
);
adj.get(u).add(v);
adj.get(v).add(u);
}
dfs1(
1
,
0
, adj, hs);
if
(hs.contains(
1
)) {
dp2[
1
] =
0
;
}
dfs2(
1
,
0
, adj, hs);
int
count =
0
;
for
(
int
i =
1
; i <= n; i++) {
if
(dp1[i] <= d && dp2[i] <= d) {
count++;
}
}
return
count;
}
int
dfs1(
int
node,
int
par, List<List<Integer> > adj,
HashSet<Integer> hs)
{
if
(hs.contains(node)) {
dp1[node] =
0
;
}
for
(
int
ngr : adj.get(node)) {
if
(ngr != par) {
int
dis = dfs1(ngr, node, adj, hs);
if
(dis != -
1
) {
dp1[node]
= Math.max(dp1[node],
1
+ dis);
}
}
}
return
dp1[node];
}
void
dfs2(
int
node,
int
par, List<List<Integer> > adj,
HashSet<Integer> hs)
{
int
max1 = -
1
, max2 = -
1
;
for
(
int
ngr : adj.get(node)) {
if
(ngr != par) {
if
(dp1[ngr] > max1) {
max2 = max1;
max1 = dp1[ngr];
}
else
if
(dp1[ngr] > max2) {
max2 = dp1[ngr];
}
}
}
for
(
int
ngr : adj.get(node)) {
if
(ngr != par) {
int
dist = (dp1[ngr] == max1) ? max2 : max1;
if
(dist != -
1
) {
dp2[ngr] = dist +
2
;
}
if
(dp2[node] != -
1
) {
dp2[ngr]
= Math.max(dp2[ngr],
1
+ dp2[node]);
}
if
(hs.contains(ngr)) {
dp2[ngr] = Math.max(dp2[ngr],
0
);
}
dfs2(ngr, node, adj, hs);
}
}
}
}
class
GFG {
public
static
void
main(String[] args)
{
int
n =
7
, m =
2
, loudness =
3
;
List<Integer> canBeHeardFrom = Arrays.asList(
3
,
5
);
List<List<Integer> > edges =
new
ArrayList<>();
edges.add(Arrays.asList(
1
,
2
));
edges.add(Arrays.asList(
1
,
3
));
edges.add(Arrays.asList(
2
,
4
));
edges.add(Arrays.asList(
2
,
5
));
edges.add(Arrays.asList(
3
,
6
));
edges.add(Arrays.asList(
3
,
7
));
Solution obj =
new
Solution();
int
res = obj.findAnnouncementNodes(
n, m, canBeHeardFrom, loudness, edges);
System.out.println(res);
}
}