202 lines
6.3 KiB
Java
202 lines
6.3 KiB
Java
|
/*This is a java program to check whether graph is DAG. In mathematics and computer science, a directed acyclic graph (DAG Listeni/’dæg/), is a directed graph with no directed cycles. That is, it is formed by a collection of vertices and directed edges, each edge connecting one vertex to another, such that there is no way to start at some vertex v and follow a sequence of edges that eventually loops back to v again.*/
|
|||
|
|
|||
|
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 GraphLinkedList
|
|||
|
{
|
|||
|
private Map<Integer, List<Integer>> adjacencyList;
|
|||
|
|
|||
|
public GraphLinkedList(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 boolean 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 true;
|
|||
|
}
|
|||
|
if (adjList.size() == 0)
|
|||
|
{
|
|||
|
count++;
|
|||
|
System.out.println("Target Node - " + i);
|
|||
|
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("Deleting edge between target node "
|
|||
|
+ i + " - " + j + " ");
|
|||
|
}
|
|||
|
}
|
|||
|
this.adjacencyList.remove(i);
|
|||
|
iteratorI = this.adjacencyList.keySet().iterator();
|
|||
|
}
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
public void printGraph()
|
|||
|
{
|
|||
|
System.out.println("The Graph is: ");
|
|||
|
for (int i = 1; i <= this.adjacencyList.size(); i++)
|
|||
|
{
|
|||
|
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 CheckDAG
|
|||
|
{
|
|||
|
public static void main(String args[])
|
|||
|
{
|
|||
|
int v, e, count = 1, to, from;
|
|||
|
Scanner sc = new Scanner(System.in);
|
|||
|
GraphLinkedList 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 GraphLinkedList(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();
|
|||
|
System.out
|
|||
|
.println("--Processing graph to check whether it is DAG--");
|
|||
|
if (glist.checkDAG())
|
|||
|
{
|
|||
|
System.out
|
|||
|
.println("Result: \nGiven graph is DAG (Directed Acyclic Graph).");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
System.out
|
|||
|
.println("Result: \nGiven graph is not DAG (Directed Acyclic Graph).");
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception E)
|
|||
|
{
|
|||
|
System.out
|
|||
|
.println("You are trying to access empty adjacency list of a node.");
|
|||
|
}
|
|||
|
sc.close();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
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
|
|||
|
4 6
|
|||
|
5 6
|
|||
|
6 3
|
|||
|
The Graph is:
|
|||
|
1 -> 2
|
|||
|
2 -> 3 -> 4
|
|||
|
4 -> 5 -> 6
|
|||
|
5 -> 6
|
|||
|
6 -> 3
|
|||
|
--Processing graph to check whether it is DAG--
|
|||
|
Target Node - 3
|
|||
|
Deleting edge between target node 3 - 2
|
|||
|
Deleting edge between target node 3 - 6
|
|||
|
Target Node - 6
|
|||
|
Deleting edge between target node 6 - 4
|
|||
|
Deleting edge between target node 6 - 5
|
|||
|
Target Node - 5
|
|||
|
Deleting edge between target node 5 - 4
|
|||
|
Target Node - 4
|
|||
|
Deleting edge between target node 4 - 2
|
|||
|
Target Node - 2
|
|||
|
Deleting edge between target node 2 - 1
|
|||
|
Result:
|
|||
|
Given graph is DAG (Directed Acyclic Graph).
|
|||
|
|
|||
|
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
|
|||
|
--Processing graph to check whether it is DAG--
|
|||
|
Target Node - 3
|
|||
|
Deleting edge between target node 3 - 2
|
|||
|
Deleting edge between target node 3 - 6
|
|||
|
Result:
|
|||
|
Given graph is not DAG (Directed Acyclic Graph).
|