Java Program to Find a Good Feedback Edge Set in a Graph

This is a java program to find feednack arc set. This is the set which contains edges which when removed from the graph, graph becomes directed acyclic graph.

Here is the source code of the Java Program to Find a Good Feedback Edge Set in a Graph. The Java program is successfully compiled and run on a Windows system. The program output is also shown below.

package com.maixuanviet.hardgraph;
 
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;
        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 getFeedbackArcSet(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 FeedbackArcSet
{
    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++;
            }
            glist.printGraph();
            Graph modified = glist.checkDAG();
            if (modified.getFeedbackArcSet(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 FeedbackArcSet.java
$ java FeedbackArcSet	
 
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 the GCD and LCM of two Numbers
Sử dụng Fork/Join Framework với ForkJoinPool trong Java
Hướng dẫn Java Design Pattern – Decorator
Hướng dẫn Java Design Pattern – Builder
Java Program to Check if a Given Graph Contain Hamiltonian Cycle or Not
Java Program to Check if a Point d lies Inside or Outside a Circle Defined by Points a, b, c in a Pl...
Tránh lỗi NullPointerException trong Java như thế nào?
Refactoring Design Pattern với tính năng mới trong Java 8
Inheritance with Jackson
Configure a RestTemplate with RestTemplateBuilder
Spring Boot - Logging
Lớp LinkedHashMap trong Java
How to Store Duplicate Keys in a Map in Java?
Java Program to Implement Bresenham Line Algorithm
Java – Get Random Item/Element From a List
Quick Intro to Spring Cloud Configuration
Java Program to Implement Suffix Array
Java Program to Implement Variable length array
Java Program to Implement Graph Structured Stack
Quick Guide to java.lang.System
Java Program to Implement Merge Sort Algorithm on Linked List
Java Program to Implement ScapeGoat Tree
Hướng dẫn sử dụng luồng vào ra ký tự trong Java
Quản lý bộ nhớ trong Java với Heap Space vs Stack
Converting String to Stream of chars
Introduction to the Java ArrayDeque
Thao tác với tập tin và thư mục trong Java
Connect through a Proxy
Using a Custom Spring MVC’s Handler Interceptor to Manage Sessions
Giới thiệu SOAP UI và thực hiện test Web Service
Serve Static Resources with Spring
Java Program to Implement Sparse Array