import
java.util.*;
import
java.util.stream.*;
class
Tuple<T1, T2> {
public
final
T1 Item1;
public
final
T2 Item2;
public
Tuple(T1 item1, T2 item2)
{
this
.Item1 = item1;
this
.Item2 = item2;
}
}
class
GFG {
static
int
findMax(List<Tuple<Integer, Integer> > V,
int
N,
int
M)
{
int
ans =
0
;
boolean
[] is_paired =
new
boolean
[N];
List<HashSet<Integer> > mapping =
new
ArrayList<>();
for
(
int
i =
0
; i <= N; i++) {
mapping.add(
new
HashSet<Integer>());
}
for
(Tuple<Integer, Integer> tuple : V) {
mapping.get(tuple.Item1).add(tuple.Item2);
}
while
(
true
) {
int
lowest = -
1
;
for
(
int
i =
1
; i <= N; i++) {
if
(mapping.get(i).size() >
0
) {
if
(lowest == -
1
) {
lowest = i;
}
else
if
(mapping.get(i).size()
< mapping.get(lowest).size()) {
lowest = i;
}
}
}
if
(lowest == -
1
) {
break
;
}
is_paired[lowest -
1
] =
true
;
int
remove
= Collections.max(mapping.get(lowest));
mapping.get(lowest).remove(remove);
for
(
int
i =
1
; i <= N; i++) {
mapping.get(i).remove(remove);
if
(i == lowest) {
mapping.get(i).clear();
}
}
ans++;
}
return
ans;
}
public
static
void
main(String[] args)
{
int
N =
3
;
int
M =
3
;
int
[] arr1 =
new
int
[] {
1
,
2
,
3
};
int
[] arr2 =
new
int
[] {
1
,
2
,
3
};
List<Tuple<Integer, Integer> > V = Arrays.asList(
new
Tuple<>(
1
,
1
),
new
Tuple<>(
2
,
1
),
new
Tuple<>(
2
,
2
),
new
Tuple<>(
3
,
1
),
new
Tuple<>(
3
,
2
),
new
Tuple<>(
3
,
3
));
System.out.println(findMax(V, N, M));
}
}