This is a java program to find the edges other than feedback arc set so that all the edges contribute to directed acyclic graph.
Here is the source code of the Java Program to Create a Minimal Set of All Edges Whose Addition will Convert it to a Strongly Connected DAG. The Java program is successfully compiled and run on a Windows system. The program output is also shown below.
package com.maixuanviet.graph;
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 Graph
{
private Map<Integer, List<Integer>> adjacencyList;
public Graph(int v)
{
adjacencyList = new HashMap<Integer, List<Integer>>();
for (int i = 1; i <= v; i++)
adjacencyList.put(i, new LinkedList<Integer>());
}
public void setEdge(int from, int to)
{
if (to > adjacencyList.size() || from > adjacencyList.size())
System.out.println("The vertices does not exists");
/*
* List<Integer> sls = adjacencyList.get(to);
* sls.add(from);
*/
List<Integer> dls = adjacencyList.get(from);
dls.add(to);
}
public List<Integer> getEdge(int to)
{
/*
* if (to > adjacencyList.size())
* {
* System.out.println("The vertices does not exists");
* return null;
* }
*/
return adjacencyList.get(to);
}
public Graph checkDAG()
{
Integer count = 0;
Iterator<Integer> iteratorI = this.adjacencyList.keySet().iterator();
Integer size = this.adjacencyList.size() - 1;
System.out.println("Minimal set of edges: ");
while (iteratorI.hasNext())
{
Integer i = iteratorI.next();
List<Integer> adjList = this.adjacencyList.get(i);
if (count == size)
{
return this;
}
if (adjList.size() == 0)
{
count++;
Iterator<Integer> iteratorJ = this.adjacencyList.keySet()
.iterator();
while (iteratorJ.hasNext())
{
Integer j = iteratorJ.next();
List<Integer> li = this.adjacencyList.get(j);
if (li.contains(i))
{
li.remove(i);
System.out.println(i + " -> " + j);
}
}
this.adjacencyList.remove(i);
iteratorI = this.adjacencyList.keySet().iterator();
}
}
return this;
}
public Map<Integer, List<Integer>> getFeedbackArcSet(int v)
{
int[] visited = new int[v + 1];
Iterator<Integer> iterator = this.adjacencyList.keySet().iterator();
Map<Integer, List<Integer>> l = new HashMap<Integer, List<Integer>>();
while (iterator.hasNext())
{
Integer i = iterator.next();
List<Integer> list = this.adjacencyList.get(i);
visited[i] = 1;
if (list.size() != 0)
{
for (int j = 0; j < list.size(); j++)
{
if (visited[list.get(j)] == 1)
{
l.put(i, new LinkedList<Integer>());
l.get(i).add(j);
}
else
{
visited[list.get(j)] = 1;
}
}
}
}
return l;
}
public void printAllEdges(Graph copyG, int v)
{
Map<Integer, List<Integer>> edges = this.getFeedbackArcSet(v);
Iterator<Integer> iterator = copyG.adjacencyList.keySet().iterator();
while (iterator.hasNext())
{
Integer i = iterator.next();
List<Integer> edgeList = this.getEdge(i);
if (edgeList.size() != 0)
{
for (int j = 0; j < edgeList.size(); j++)
{
if (edges.containsKey(i) && edges.get(i).contains(j))
continue;
else
{
System.out.print(i + " -> " + edgeList.get(j));
}
}
System.out.println();
}
}
}
public void printGraph()
{
System.out.println("The Graph is: ");
Iterator<Integer> iterator = this.adjacencyList.keySet().iterator();
while (iterator.hasNext())
{
Integer i = iterator.next();
List<Integer> edgeList = this.getEdge(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 class MinimalSetofEdgesforDAG
{
public static void main(String args[])
{
int v, e, count = 1, to, from;
Scanner sc = new Scanner(System.in);
Graph glist;
try
{
System.out.println("Enter the number of vertices: ");
v = sc.nextInt();
System.out.println("Enter the number of edges: ");
e = sc.nextInt();
glist = new Graph(v);
System.out.println("Enter the edges in the graph : <from> <to>");
while (count <= e)
{
to = sc.nextInt();
from = sc.nextInt();
glist.setEdge(to, from);
count++;
}
Graph copyofGlist = new Graph(v);
copyofGlist = glist;
glist.printGraph();
Graph modified = glist.checkDAG();
modified.printAllEdges(copyofGlist, v);
}
catch (Exception E)
{
System.out
.println("You are trying to access empty adjacency list of a node.");
}
sc.close();
}
}
Output:
$ javac MinimalSetofEdgesforDAG.java $ java MinimalSetofEdgesforDAG Enter the number of vertices: 6 Enter the number of edges: 7 Enter the edges in the graph : <from> <to> 1 2 2 3 2 4 4 5 5 6 6 3 6 4 The Graph is: 1 -> 2 2 -> 3 -> 4 4 -> 5 5 -> 6 6 -> 3 -> 4 Minimal set of edges: 3 -> 2 3 -> 6 1 -> 2 2 -> 4 4 -> 5 5 -> 6
Related posts:
Different Ways to Capture Java Heap Dumps
Check If Two Lists are Equal in Java
Filtering a Stream of Optionals in Java
Java Program to Implement Queue using Linked List
Testing an OAuth Secured API with Spring MVC
Java Program to Implement the Binary Counting Method to Generate Subsets of a Set
Java Program to Implement Gift Wrapping Algorithm in Two Dimensions
Introduction to Spring MVC HandlerInterceptor
Changing Annotation Parameters At Runtime
Java equals() and hashCode() Contracts
Java 8 StringJoiner
Java Program to Find Minimum Element in an Array using Linear Search
Binary Numbers in Java
Java Program to Check Whether an Undirected Graph Contains a Eulerian Cycle
Tính kế thừa (Inheritance) trong java
Java Program to Find the Minimum Element of a Rotated Sorted Array using Binary Search approach
Java Program to find the peak element of an array using Binary Search approach
Predicate trong Java 8
Exception Handling in Java
Spring Security – Reset Your Password
Quick Guide on Loading Initial Data with Spring Boot
Java Web Services – JAX-WS – SOAP
Java Program to Implement Ternary Search Algorithm
Introduction to Spring Boot CLI
Java Program to Perform Partition of an Integer in All Possible Ways
Spring Boot - Web Socket
Comparing Objects in Java
An Introduction to ThreadLocal in Java
Guide to Spring Cloud Kubernetes
Spring Data JPA @Modifying Annotation
Java Program to Implement Hash Tree
Java Program to Implement RoleUnresolvedList API