import
java.util.HashMap;
import
java.util.Iterator;
import
java.util.LinkedList;
import
java.util.List;
import
java.util.Map;
import
java.util.Scanner;
class
Edge
{
private
Map<Integer, List<Integer> > adjacentList;
public
Edge(
int
vertices)
{
adjacentList
=
new
HashMap<Integer, List<Integer> >();
for
(
int
i =
1
; i <= vertices; i++) {
adjacentList.put(i,
new
LinkedList<Integer>());
}
}
public
void
set_Edge(
int
end,
int
start)
{
if
(end > adjacentList.size()
|| start > adjacentList.size())
System.out.println(
"There are no vertices"
);
List<Integer> fls = adjacentList.get(start);
fls.add(end);
}
public
List<Integer> get_Edge(
int
end)
{
return
adjacentList.get(end);
}
public
Edge check()
{
Integer count =
0
;
Iterator<Integer> iterator
=
this
.adjacentList.keySet().iterator();
Integer size =
this
.adjacentList.size() -
1
;
while
(iterator.hasNext()) {
Integer i = iterator.next();
List<Integer> adjList
=
this
.adjacentList.get(i);
if
(count == size) {
return
this
;
}
if
(adjList.size() ==
0
) {
count++;
Iterator<Integer> iteratorR
=
this
.adjacentList.keySet().iterator();
while
(iteratorR.hasNext()) {
Integer R = iteratorR.next();
List<Integer> lit
=
this
.adjacentList.get(R);
if
(lit.contains(i)) {
lit.remove(i);
}
}
this
.adjacentList.remove(i);
iterator
=
this
.adjacentList.keySet().iterator();
}
}
return
this
;
}
public
void
printGraph()
{
System.out.println(
"The Graph is:"
);
Iterator<Integer> iterator
=
this
.adjacentList.keySet().iterator();
while
(iterator.hasNext())
{
Integer i = iterator.next();
List<Integer> edgeList =
this
.get_Edge(i);
if
(edgeList.size() !=
0
)
{
System.out.print(i);
for
(
int
j =
0
; j < edgeList.size(); j++)
{
System.out.print(
"-> "
+ edgeList.get(j));
}
System.out.println();
}
}
}
public
boolean
getFeedbackArcSet(
int
vertices)
{
boolean
flag =
false
;
int
[] visited =
new
int
[vertices +
1
];
Iterator<Integer> iterator
=
this
.adjacentList.keySet().iterator();
System.out.print(
"The set of edges in FeedBack arc set: "
);
while
(iterator.hasNext())
{
Integer i = iterator.next();
List<Integer> list =
this
.adjacentList.get(i);
visited[i] =
1
;
if
(list.size() !=
0
)
{
for
(
int
j =
0
; j < list.size(); j++)
{
if
(visited[list.get(j)] ==
1
)
{
flag =
true
;
System.out.println(i +
" - "
+ list.get(j));
}
else
{
visited[list.get(j)] =
1
;
}
}
}
}
return
flag;
}
}
class
GFG {
public
static
void
main(String[] args)
{
int
vertices =
4
, e =
5
, count =
1
;
int
[] start = {
1
,
2
,
3
,
4
,
1
};
int
[] end = {
2
,
3
,
4
,
1
,
3
};
Edge ist;
try
{
System.out.println(
"Number of vertices: "
+ vertices);
System.out.println(
"Number of edges: "
+ e);
ist =
new
Edge(vertices);
for
(
int
i =
0
; i < e; i++)
{
ist.set_Edge(end[i], start[i]);
}
ist.printGraph();
Edge modified = ist.check();
if
(modified.getFeedbackArcSet(vertices)
==
false
)
{
System.out.println(
"None"
);
}
}
catch
(Exception E)
{
System.out.println(
"Empty Nodes"
);
}
}
}