import
java.io.*;
import
java.util.*;
class
GFG
{
static
int
bfsWithDistance(ArrayList<ArrayList<Integer>> g,
boolean
mark[],
int
u,
ArrayList<Integer> dis)
{
int
lastMarked =
0
;
Queue<Integer> q =
new
LinkedList<>();
q.add(u);
dis.set(u ,
0
);
while
(!q.isEmpty())
{
u = q.remove();
if
(mark[u] ==
true
)
lastMarked = u;
for
(
int
i =
0
; i < g.get(u).size(); i++)
{
int
v = g.get(u).get(i);
if
(dis.get(v) == -
1
)
{
dis.set(v , dis.get(u) +
1
);
q.add(v);
}
}
}
return
lastMarked;
}
static
int
nodesKDistanceFromMarked(
int
edges[][],
int
V,
int
marked[],
int
N,
int
K)
{
V = V +
1
;
ArrayList<ArrayList<Integer>>g =
new
ArrayList<ArrayList<Integer>>(V);
for
(
int
i=
0
;i<V;i++){
g.add(
new
ArrayList<Integer>());
}
int
u, v;
for
(
int
i =
0
; i < (V -
1
); i++)
{
u = edges[i][
0
];
v = edges[i][
1
];
g.get(u).add(v);
g.get(v).add(u);
}
boolean
mark[] =
new
boolean
[V];
Arrays.fill(mark,
false
);
for
(
int
i =
0
; i < N; i++)
mark[marked[i]] =
true
;
ArrayList<Integer> tmp =
new
ArrayList<>(),dl =
new
ArrayList<>(),dr =
new
ArrayList<>();
for
(
int
i=
0
;i<V;i++){
tmp.add(-
1
);
dl.add(-
1
);
dr.add(-
1
);
}
u = bfsWithDistance(g, mark,
0
, tmp);
v = bfsWithDistance(g, mark, u, dl);
bfsWithDistance(g, mark, v, dr);
int
res =
0
;
for
(
int
i =
0
; i < V; i++)
{
if
(dl.get(i) <= K && dr.get(i) <= K)
res++;
}
return
res;
}
public
static
void
main(String args[])
{
int
edges[][] =
{
{
1
,
0
}, {
0
,
3
}, {
0
,
8
}, {
2
,
3
},
{
3
,
5
}, {
3
,
6
}, {
3
,
7
}, {
4
,
5
},
{
5
,
9
}
};
int
V = edges.length;
int
marked[] = {
1
,
2
,
4
};
int
N = marked.length;
int
K =
3
;
System.out.println(nodesKDistanceFromMarked(edges, V, marked, N, K));
}
}