Java Program to Find a Good Feedback Vertex Set

This is a java program to find feedback vertex set. This is the set which contains vertices when removed from graph, graph becomes Directed acuclic graph.

Here is the source code of the Java Program to Find a Good Feedback Vertex Set. 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 GraphLL
{
    private Map<Integer, List<Integer>> adjacencyList;
 
    public GraphLL(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 GraphLL 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 getFeedbackVertexSet(int v)
    {
        boolean flag = false;
        int[] visited = new int[v + 1];
        Iterator<Integer> iterator = this.adjacencyList.keySet().iterator();
        System.out.print("The set of vertices in feedback vertex 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(list.get(j) + " ");
                    }
                    else
                    {
                        visited[list.get(j)] = 1;
                    }
                }
            }
        }
        return flag;
    }
}
 
public class FeedbackVertexSet
{
    public static void main(String args[])
    {
        int v, e, count = 1, to, from;
        Scanner sc = new Scanner(System.in);
        GraphLL 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 GraphLL(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();
            GraphLL modified = glist.checkDAG();
            if (modified.getFeedbackVertexSet(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:

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 vertices in feedback vertex set: 4

Related posts:

Java Program to Check whether Graph is a Bipartite using BFS
Introduction to Spring Cloud Netflix – Eureka
Java – Rename or Move a File
Introduction to the Functional Web Framework in Spring 5
A Guide to the finalize Method in Java
Using a List of Values in a JdbcTemplate IN Clause
Versioning a REST API
Jackson Unmarshalling JSON with Unknown Properties
Java Web Services – Jersey JAX-RS – REST và sử dụng REST API testing tools với Postman
Overview of Spring Boot Dev Tools
Spring Security – Reset Your Password
Java Program to Construct an Expression Tree for an Prefix Expression
A Guide to the ViewResolver in Spring MVC
New Features in Java 12
Tạo ứng dụng Java RESTful Client không sử dụng 3rd party libraries
Java Program to Use rand and srand Functions
Java Program to Solve TSP Using Minimum Spanning Trees
Chuyển đổi từ HashMap sang ArrayList
More Jackson Annotations
Java Program to Implement a Binary Search Algorithm for a Specific Search Sequence
Java Program to Implement Circular Doubly Linked List
Java Program to Find Number of Articulation points in a Graph
Spring Security 5 for Reactive Applications
Java Program to Find the Edge Connectivity of a Graph
Comparing Long Values in Java
Java Program to Implement Adjacency List
Java Program to Implement an Algorithm to Find the Global min Cut in a Graph
Java Program to Implement Fisher-Yates Algorithm for Array Shuffling
Sử dụng CyclicBarrier trong Java
Hướng dẫn sử dụng biểu thức chính quy (Regular Expression) trong Java
Explain about URL and HTTPS protocol
Java Program to Implement Unrolled Linked List