import
java.util.*;
public
class
GFG {
public
static
int
minEdgesRemoval(
int
[][] edges,
int
n)
{
Map<Integer, List<Integer> > graph
=
new
HashMap<Integer, List<Integer> >();
int
start = edges[
0
][
0
];
int
end = edges[
0
][
1
];
for
(
int
i =
0
; i < n; i++) {
int
n1 = edges[i][
0
];
int
n2 = edges[i][
1
];
List<Integer> li;
if
(graph.containsKey(n1)) {
li = graph.get(n1);
}
else
{
li =
new
ArrayList<Integer>();
}
li.add(n2);
graph.put(n1, li);
if
(graph.containsKey(n2)) {
li = graph.get(n2);
}
else
{
li =
new
ArrayList<Integer>();
}
li.add(n1);
graph.put(n2, li);
}
int
deleteEdgeCount =
0
;
while
(
true
) {
Map<Integer, Integer> bfsTraversalPath = bfs(graph, start);
if
(bfsTraversalPath.containsKey(end)) {
deleteEdgeCount++;
int
parent = bfsTraversalPath.get(end);
int
currEnd = end;
while
(parent != -
1
)
{
deleteEdge(graph, parent, currEnd);
deleteEdge(graph, currEnd, parent);
currEnd = parent;
parent = bfsTraversalPath.get(currEnd);
}
}
else
{
break
;
}
}
return
deleteEdgeCount;
}
private
static
void
deleteEdge(Map<Integer, List<Integer> > graph,
Integer start, Integer end)
{
List<Integer> list = graph.get(start);
list.remove(end);
}
private
static
Map<Integer, Integer>
bfs(Map<Integer, List<Integer> > graph,
int
start)
{
Map<Integer, Integer> bfsTraversalPath
=
new
HashMap<Integer, Integer>();
List<Integer> visited =
new
ArrayList<Integer>();
List<Integer> queue =
new
ArrayList<Integer>();
int
qStartIndex =
0
;
bfsTraversalPath.put(start, -
1
);
queue.add(start);
while
(qStartIndex < queue.size())
{
int
curr = queue.get(qStartIndex++);
visited.add(curr);
for
(
int
k : graph.get(curr))
{
if
(!visited.contains(k))
{
queue.add(k);
if
(!bfsTraversalPath.containsKey(k))
{
bfsTraversalPath.put(k, curr);
}
}
}
}
return
bfsTraversalPath;
}
public
static
void
main(String[] args)
{
int
n =
7
;
int
[][] edges
= { {
0
,
1
}, {
1
,
2
}, {
2
,
3
}, {
3
,
4
},
{
4
,
0
}, {
4
,
1
}, {
1
,
3
} };
System.out.println(
"Minimum Number of Edges to Remove = "
+ minEdgesRemoval(edges, n));
}
}