import
java.io.*;
import
java.util.*;
public
class
GFG{
static
class
Pair
{
int
left;
int
right;
public
Pair(
int
left,
int
right)
{
this
.left = left;
this
.right = right;
}
@Override
public
int
hashCode()
{
final
int
prime =
31
;
int
result =
1
;
result = prime * result + left;
result = prime * result + right;
return
result;
}
@Override
public
boolean
equals( Object other )
{
if
(
this
== other){
return
true
;}
if
(other
instanceof
Pair)
{
Pair m = (Pair)other;
return
this
.left == m.left &&
this
.right == m.right;
}
return
false
;
}
}
public
static
void
bfs(
int
start,
int
n,
int
m,
Set<Pair> edges)
{
int
i;
Set<Integer> undiscovered =
new
HashSet<>();
int
[] distance_node =
new
int
[
1000
];
for
(i =
1
; i <= n; i++)
{
undiscovered.add(i);
distance_node[i] = Integer.MAX_VALUE;
}
undiscovered.remove(start);
distance_node[start] =
0
;
Queue<Integer> q =
new
LinkedList<>();
q.add(start);
while
(undiscovered.size() >
0
&& !q.isEmpty())
{
int
cur = q.peek();
q.remove();
List<Integer>complement_vertex =
new
ArrayList<>();
for
(
int
x : undiscovered)
{
Pair temp1 =
new
Pair(cur, x);
Pair temp2 =
new
Pair(x, cur);
if
(!edges.contains(temp1) &&
!edges.contains(temp2))
{
complement_vertex.add(x);
}
}
for
(
int
x : complement_vertex)
{
if
(distance_node[x] >
distance_node[cur] +
1
)
{
distance_node[x] =
distance_node[cur] +
1
;
q.add(x);
}
undiscovered.remove(x);
}
}
for
(i =
1
; i <= n; i++)
System.out.print(distance_node[i] +
" "
);
}
public
static
void
main(String[] args)
{
int
n =
5
, m =
4
;
Set<Pair> edges =
new
HashSet<>();
edges.add(
new
Pair(
1
,
3
));
edges.add(
new
Pair(
3
,
1
));
edges.add(
new
Pair(
1
,
2
));
edges.add(
new
Pair(
2
,
1
));
edges.add(
new
Pair(
3
,
4
));
edges.add(
new
Pair(
4
,
3
));
edges.add(
new
Pair(
3
,
5
)) ;
edges.add(
new
Pair(
5
,
3
));
Pair t =
new
Pair(
1
,
3
);
bfs(
1
, n, m, edges);
}
}