This is a java program to set of edges upon removal of which linear extension can be found. In simple terms this version of code finds the feedbackarc set, which when removed from graph leads to DAG for which we can find the topological sorting.
Here is the source code of the Java Program to Remove the Edges in a Given Cyclic Graph such that its Linear Extension can be Found. 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 GraphLE { private Map<Integer, List<Integer>> adjacencyList; public GraphLE(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 GraphLE checkDAG() { Integer count = 0; Iterator<Integer> iteratorI = this.adjacencyList.keySet().iterator(); Integer size = this.adjacencyList.size() - 1; 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); } } this.adjacencyList.remove(i); iteratorI = this.adjacencyList.keySet().iterator(); } } return this; } 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 boolean removeEdgesToGetLinearExtension(int v) { boolean flag = false; int[] visited = new int[v + 1]; Iterator<Integer> iterator = this.adjacencyList.keySet().iterator(); System.out.print("The set of edges in feedback arc set: "); 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) { flag = true; System.out.println(i + " - " + list.get(j)); } else { visited[list.get(j)] = 1; } } } } return flag; } } public class RemoveEdgesLinearExtension { public static void main(String args[]) { int v, e, count = 1, to, from; Scanner sc = new Scanner(System.in); GraphLE 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 GraphLE(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++; } glist.printGraph(); GraphLE modified = glist.checkDAG(); if (modified.removeEdgesToGetLinearExtension(v) == false) { System.out.println("None"); } } catch (Exception E) { System.out .println("You are trying to access empty adjacency list of a node."); } sc.close(); } }
Output:
$ javac RemoveEdgesLinearExtension.java $ java RemoveEdgesLinearExtension 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 4 6 3 The Graph is: 1 -> 2 2 -> 3 -> 4 4 -> 5 5 -> 6 6 -> 4 -> 3 The set of edges in feedback arc set: 6 - 4
Related posts:
Java Program to Find a Good Feedback Edge Set in a Graph
Java Program to Find All Pairs Shortest Path
New in Spring Security OAuth2 – Verify Claims
Java Program to Implement Floyd-Warshall Algorithm
Spring Data MongoDB – Indexes, Annotations and Converters
Convert String to Byte Array and Reverse in Java
The Spring @Controller and @RestController Annotations
Assertions in JUnit 4 and JUnit 5
Finding Max/Min of a List or Collection
Java InputStream to Byte Array and ByteBuffer
Guide to the Java ArrayList
OAuth2 for a Spring REST API – Handle the Refresh Token in AngularJS
Java Program to Implement Sorting of Less than 100 Numbers in O(n) Complexity
The HttpMediaTypeNotAcceptableException in Spring MVC
A Guide to the finalize Method in Java
Java Program to Solve Knapsack Problem Using Dynamic Programming
Guide to BufferedReader
Query Entities by Dates and Times with Spring Data JPA
Java Program to Implement Johnson’s Algorithm
Checking for Empty or Blank Strings in Java
Java Program to Implement Warshall Algorithm
Guide to @ConfigurationProperties in Spring Boot
Java Program to Implement Multi-Threaded Version of Binary Search Tree
Spring REST API with Protocol Buffers
Spring RestTemplate Request/Response Logging
Java Program to Find Transitive Closure of a Graph
Java Program to Implement Wagner and Fisher Algorithm for online String Matching
Java Program to Print only Odd Numbered Levels of a Tree
Java Program to Apply Above-Below-on Test to Find the Position of a Point with respect to a Line
Java Program to Solve Set Cover Problem assuming at max 2 Elements in a Subset
How to use the Spring FactoryBean?
An Intro to Spring Cloud Task