import
java.util.*;
class
Tuple<X, Y> {
public
final
X x;
public
final
Y y;
public
Tuple(X x, Y y)
{
this
.x = x;
this
.y = y;
}
public
X getX() {
return
x; }
public
Y getY() {
return
y; }
}
class
GFG {
public
static
void
countMinDistance(
int
n,
int
m,
int
[][] edges)
{
List<Integer>[] g =
new
ArrayList[
10005
];
for
(
int
i =
0
; i <
10005
; i++) {
g[i] =
new
ArrayList<Integer>();
}
for
(
int
i =
0
; i < m; i++) {
int
a = edges[i][
0
] -
1
;
int
b = edges[i][
1
] -
1
;
g[a].add(b);
g[b].add(a);
}
Queue<Tuple<Integer, Integer> > queue1
=
new
LinkedList<Tuple<Integer, Integer> >();
queue1.offer(
new
Tuple<Integer, Integer>(
0
,
0
));
int
[] dist =
new
int
[n];
int
[] ways1 =
new
int
[n];
for
(
int
i =
0
; i < n; i++) {
dist[i] =
1000000000
;
}
dist[
0
] =
0
;
ways1[
0
] =
1
;
while
(queue1.size() >
0
) {
Tuple<Integer, Integer> up = queue1.poll();
int
x = up.x;
int
dis = up.y;
if
(dis > dist[x])
continue
;
if
(x == n -
1
)
continue
;
for
(
int
y : g[x]) {
if
(dist[y] > dis +
1
) {
dist[y] = dis +
1
;
ways1[y] = ways1[x];
queue1.offer(
new
Tuple<Integer, Integer>(
y, dis +
1
));
}
else
if
(dist[y] == dis +
1
) {
ways1[y] += ways1[x];
}
}
}
Queue<Tuple<Integer, Integer> > queue2
=
new
LinkedList<Tuple<Integer, Integer> >();
queue2.offer(
new
Tuple<Integer, Integer>(n -
1
,
0
));
int
[] dist1 =
new
int
[n];
int
[] ways2 =
new
int
[n];
for
(
int
i =
0
; i < n; i++) {
dist1[i] =
1000000000
;
}
dist1[n -
1
] =
0
;
ways2[n -
1
] =
1
;
while
(queue2.size() >
0
) {
Tuple<Integer, Integer> up = queue2.poll();
int
x = up.x;
int
dis = up.y;
if
(dis > dist1[x])
continue
;
if
(x ==
0
)
continue
;
for
(
int
y : g[x]) {
if
(dist1[y] > dis +
1
) {
dist1[y] = dis +
1
;
ways2[y] = ways2[x];
queue2.offer(
new
Tuple<Integer, Integer>(
y, dis +
1
));
}
else
if
(dist1[y] ==
1
+ dis) {
ways2[y] += ways2[x];
}
}
}
for
(
int
i =
0
; i < n; i++) {
System.out.print(ways1[i] * ways2[i] +
" "
);
}
}
public
static
void
main(String[] args)
{
int
N =
5
, M =
5
;
int
edges[][] =
new
int
[][] {
new
int
[] {
1
,
2
},
new
int
[] {
1
,
4
},
new
int
[] {
1
,
3
},
new
int
[] {
2
,
5
},
new
int
[] {
2
,
4
} };
countMinDistance(N, M, edges);
}
}