📜  在图中查找良好反馈顶点集的Java程序

📅  最后修改于: 2021-10-25 05:16:16             🧑  作者: Mango

图的反馈顶点集是一组顶点,其移除后使图没有环。下面的图成为有向无环图。

例子:

Input:
Enter the number of vertices:  
4
Enter the number of edges:  
5
Enter the graph:  
1 2
2 3
3 4
4 1
1 3
Output:
The Graph is:
1-> 2-> 3
2-> 3
3-> 4
4-> 1
The set of edges in FeedBack arc set: 2 - 3
4 - 1

Input:
Enter the number of vertices:  
5
Enter the number of edges:  
5
Enter the graph:  
1 2
2 4
5 3
5 1
4 3.
Output:
The Graph is:
1-> 2
2-> 4
4-> 3
5-> 3-> 1
The set of edges in FeedBack arc set: None

方法:

  • 我们将声明所有需要的变量,如计数、边、开始、结束和顶点
  • 现在我们将调用图形函数:我们将获取并将值存储在相邻的列表中,该列表将被声明为类的变量。
  • 然后保持while条件,我们将在图中获取构造函数的所有起点和终点的输入。
  • 现在调用 set edge函数:我们检查相邻列表是否为空,如果不是,我们将在其中存储它的值。
  • 然后我们调用 printGraph()函数——这个方法基本上会打印图形,其中我们迭代循环并打印元素,并将其存储在列表中
  • 然后我们调用类的对象并调用检查函数——每个迭代器检查我们是否只取了一次值 如果该值重复,我们将其删除
  • 然后我们设置反馈顶点并调用函数- 我们现在将检查我们是否已经访问了所有节点,如果我们已经访问了它,我们将对其进行计数,如果我们没有我们将它保持等于 1。现在使用所有这些我们会找到可以删除的节点。

代码:

Java
// Java Program to Find a Good Feedback Vertex Set in a
// 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;
 
// Let us declare a class
class Edge
 
{
 
    // We have declared a Map with Integer as its parameters
    // Named adjacentList
 
    private Map > adjacentList;
 
    // Now lets us declare a function called "Graph"
    public Edge(int vertices)
    {
        // Now taking the new List as a HashMap
        adjacentList
            = new HashMap >();
 
        // Iterating i from 1 till vertices
        for (int i = 1; i <= vertices; i++) {
            // Adding them to a new LinkedList
            adjacentList.put(i, new LinkedList());
        }
    }
 
    // We are now declaring  a class edge
    // It has two parameters start and end
    public void set_Edge(int end, int start)
    {
        // We will write the condition for checking
        // If the the vertices are empty
        if (end > adjacentList.size()
            || start > adjacentList.size())
 
            System.out.println("There are no vertices");
 
        // Now if the input isn't zero
        // We will add them to a new list
        List fls = adjacentList.get(start);
 
        fls.add(end);
    }
 
    // We created a list function called get edge
    // Help us to return the edges of a Graph
    public List get_Edge(int end)
    {
 
        // Returning the edges back
        return adjacentList.get(end);
    }
 
    // Now let us check
    public Edge check()
    {
 
        // Now let us keep the count as 0
        Integer count = 0;
 
        // Let us iterator for easy function
        Iterator iterator
            = this.adjacentList.keySet().iterator();
 
        // Let us take a size variable of adjacent List
        Integer size = this.adjacentList.size() - 1;
 
        // Iterating it till the end of the loop
        while (iterator.hasNext()) {
 
            // Now taking the variable which is an iterator
            Integer i = iterator.next();
 
            // Declaring a new list adjlist
            List adjList
                = this.adjacentList.get(i);
 
            // checking for equal size we would return the
            // same
            if (count == size) {
                return this;
            }
 
            // Now keeping the condition adjList==0
            if (adjList.size() == 0) {
 
                // Every time we run the if
                // we increase the count
                count++;
 
                // Now taking an iterator Right
                Iterator iteratorR
                    = this.adjacentList.keySet().iterator();
 
                // Again iterating completely over the new
                // Iterator
                while (iteratorR.hasNext()) {
 
                    // Having the new R , help us to iterate
                    // the new Iterator
                    Integer R = iteratorR.next();
 
                    // New List is taken
 
                    List lit
                        = this.adjacentList.get(R);
 
                    // This if condition will help not to
                    // have
 
                    // Any duplicate values inside the new
                    // List
                    if (lit.contains(i)) {
                        // If we have one we would remove it
 
                        lit.remove(i);
                    }
                }
 
                // The below line would help us to remove
                // the values
 
                // Of the adjacent List as we move on to
                // make the vertices
 
                // The other values are simultaneously
                // removed.
                this.adjacentList.remove(i);
 
                iterator
                    = this.adjacentList.keySet().iterator();
            }
        }
 
        return this;
    }
 
    // This function helps us to print a graph
    public void printGraph()
 
    {
 
        System.out.println("The Graph is:");
 
        // Now let us taken an iterator and try to print it
 
        // This iterator contains the values of the new
        // graph
        Iterator iterator
            = this.adjacentList.keySet().iterator();
 
        // Now  iterating the values
        while (iterator.hasNext())
 
        {
 
            // taking the variable i to be the next Iterator
            Integer i = iterator.next();
 
            // Taking a list which will help us have the
            // side edges.
            List edgeList = this.get_Edge(i);
 
            // Now checking the edge list if it is not zero
            if (edgeList.size() != 0)
 
            {
 
                // print them out
                System.out.print(i);
 
                // now iterating it till edgelist
                for (int j = 0; j < edgeList.size(); j++)
 
                {
 
                    // Now printing the graph in its pattern
                    System.out.print("-> "
                                     + edgeList.get(j));
                }
 
                System.out.println();
            }
        }
    }
 
    // Closing the function
 
    // Now finding the FeedbackArc set
    public boolean getFeedbackArcSet(int vertices)
 
    {
 
        // Taking boolean flag false
        boolean flag = false;
 
        // Now taking visited array
        // This array length is vertices+1
        int[] visited = new int[vertices + 1];
 
        // This iterator has values of adjacent list
        Iterator iterator
            = this.adjacentList.keySet().iterator();
 
        // Now let us see the feedback arc
        System.out.print(
            "The set of edges in FeedBack arc set: ");
 
        // Now it has iterator which is next
        while (iterator.hasNext())
 
        {
 
            // Now taking i which will be iterating next
            Integer i = iterator.next();
 
            // Now taking a list of values adjacent list
            List list = this.adjacentList.get(i);
 
            // Visited array to be after i
            visited[i] = 1;
 
            // Now taking if the list size not equal to 0
            if (list.size() != 0)
 
            {
 
                // We iterate till list sie
                for (int j = 0; j < list.size(); j++)
 
                {
 
                    // If we have visited the list
                    // e will flag it to be true
                    if (visited[list.get(j)] == 1)
 
                    {
 
                        flag = true;
 
                        // Now taking the output of feedback
                        // arc
                        System.out.println(i + " - "
                                           + list.get(j));
                    }
 
                    else
 
                    {
 
                        // Now if we dint visit
                        // We will be iterating it to 1
                        visited[list.get(j)] = 1;
                    }
                }
            }
        }
 
        // Return the flag
        return flag;
    }
}
 
// Now let us declare the class GFG
 
class GFG {
 
    public static void main(String[] args)
    {
 
        // Now let us declare and initialize all the
        // variables
        int vertices = 4, e = 5, count = 1;
        int[] start = { 1, 2, 3, 4, 1 };
        int[] end = { 2, 3, 4, 1, 3 };
 
        // Now let us see  the object of the class
        Edge ist;
 
        // Now let us try the exception.
        try
 
        {
 
            // printing both the values
            System.out.println("Number of vertices: "
                               + vertices);
 
            System.out.println("Number of edges: " + e);
 
            // Now calling the function
            ist = new Edge(vertices);
 
            // calling the function by iterating the loop
            for (int i = 0; i < e; i++)
 
            {
 
                // Now calling the function set_edge
                ist.set_Edge(end[i], start[i]);
            }
 
            // Now we are calling the print Graph Function
            ist.printGraph();
 
            // Now we will call the object of class
            // and then we called the function check
            Edge modified = ist.check();
 
            // If we dont get the flag to be true
            // We can print the output to be None or empty
            if (modified.getFeedbackArcSet(vertices)
                == false)
 
            {
 
                System.out.println("None");
            }
        }
 
        // Try for catch
        // We print empty nodes
        catch (Exception E)
 
        {
 
            System.out.println("Empty Nodes");
        }
    }
}


输出
Number of vertices: 4
Number of edges: 5
The Graph is:
1-> 2-> 3
2-> 3
3-> 4
4-> 1
The set of edges in FeedBack arc set: 2 - 3
4 - 1

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程