Unweighted Graphs Using Linked Lists

I hope you liked my post on Bellman ford graph algorithm implementation in Java. With slight changes to my existing code I have recently implemented the Unweighted Graph using linked lists algorithm in Java . You can add additional weight field to the Edge class in case if you want to implement the minimum spanning tree algorithm using linked lists .
/* copyright information Author Name - Raj Gopal Bhallamudi Email - flame527@yahoo.com , rajgopal527@gmail.com Facebook - facebook.com/r5274 Instagram - instagram.com/bhrajgopal */ import java.util.LinkedList; import java.util.LinkedHashMap; import java.util.Set; import java.util.Iterator; import java.util.Scanner; import java.util.InputMismatchException; class Edge { String edge; } class Graph { LinkedHashMap<String, LinkedList<Edge>> H = new LinkedHashMap<>(); } public class Example { static int vertexCount=0; static int edgeCount=0; public static void main(String[] args) { Runtime runtime = Runtime.getRuntime(); runtime.gc(); long before = runtime.totalMemory() - runtime.freeMemory(); Graph graphObject = null; bellmanFord(graphObject); runtime.gc(); long after = runtime.totalMemory() - runtime.freeMemory(); System.out.println("\n \n Total Memory used in bytes " + (after - before) ); } static void bellmanFord(Graph graphObject) { Scanner scan = new Scanner(System.in); if (graphObject == null) graphObject = new Graph(); int input = 0; do { System.out.println( "\n\n\n\n 1.create graph 2.print graph 3.insert vertex 4.insert edge\n 5.delete vertex 6.delete edge 7.search vertex 8.search edge \n 9.Delete graph 10.completed "); try { input = scan.nextInt(); } catch (InputMismatchException e) { scan.nextLine(); } switch (input) { case 1: if (graphObject.H.size() > 0) System.out.println("Graph already created"); else creategraph(graphObject, scan); break; case 2: if (graphObject.H.size() > 0) display(graphObject); else System.out.println("Graph is empty"); break; case 3: if (graphObject.H.size() > 0) insertvertex(graphObject, scan); else System.out.println("Graph is empty"); break; case 4: if (graphObject.H.size() > 0) insertedge(graphObject, scan); else System.out.println("Graph is empty"); break; case 5: if (graphObject.H.size() > 0) deletevertex(graphObject, scan); else System.out.println("Graph is empty"); break; case 6: if (graphObject.H.size() > 0) deleteedge(graphObject, scan); else System.out.println("Graph is empty"); break; case 7: if (graphObject.H.size() > 0) searchvertex(graphObject, scan); else System.out.println("Graph is empty"); break; case 8: if (graphObject.H.size() > 0) searchedge(graphObject, scan); else System.out.println("Graph is empty"); break; case 9: if (graphObject.H.size() > 0) del(graphObject); else System.out.println("Graph is empty"); break; case 10: break; default: System.out.println("Invalid input received please try again"); break; } } while (input != 10); } static void display(Graph graphObject) { System.out.println("\n CREATED GRAPH IS \n"); for (String vertex : graphObject.H.keySet()) { LinkedList<Edge> edges = graphObject.H.get(vertex); if (edges.size() > 0) { for (Edge edge : edges) System.out.print("(" + vertex + "," + edge.edge + ")"+ " "); System.out.println(); } else { System.out.print("(" + vertex + ")"); System.out.println(); } } System.out.println("\n\n Total number of vertices = "+vertexCount); System.out.println(" Total number of edges = "+edgeCount); } static void creategraph(Graph obj, Scanner scan) { String input, invalid = "END"; LinkedList<String> vertex = new LinkedList<>(); do { System.out.println("enter a vertex else type END"); input = scan.next(); if (!(input.equals(invalid))) if (!(vertex.contains(input))) { vertex.add(input); vertexCount++; } else { System.out.println("Duplicate vertex not allowed"); } } while (!input.equals(invalid)); for (int current = 0; current < vertex.size(); current++) { String currentVertex = vertex.get(current); LinkedList<Edge> edgeList=edgelistinsert(obj,currentVertex,vertex,scan); obj.H.put(currentVertex, edgeList); } } static void insertvertex(Graph obj, Scanner sc) { String currentVertex; System.out.println("Enter a vertex"); currentVertex = sc.next(); if (obj.H.containsKey(currentVertex)) System.out.println("vertex already present"); else { LinkedList<String> vertex = new LinkedList<>(obj.H.keySet()); LinkedList<Edge> edgeList = edgelistinsert(obj,currentVertex,vertex,sc); obj.H.put(currentVertex , edgeList); vertexCount++; } } static void insertedge(Graph obj, Scanner sc) { String firstVertex, secondVertex; int duplicateFlag; System.out.println("Enter first end vertex"); firstVertex = sc.next(); if (obj.H.containsKey(firstVertex)) { System.out.println("Enter second end vertex"); secondVertex = sc.next(); if (obj.H.containsKey(secondVertex)) { LinkedList<Edge> edgeList = obj.H.get(firstVertex); duplicateFlag = search(obj, firstVertex, secondVertex); if (duplicateFlag == 1) { System.out.println("edge already present"); } else { Edge temp2 = new Edge(); temp2.edge = secondVertex; edgeList.add(temp2); insideinsert(obj,secondVertex,firstVertex); edgeCount=edgeCount+2; } } else { System.out.println("invalid second end vertex"); } } else { System.out.println("invalid first end vertex"); } } static void searchedge(Graph obj, Scanner sc) { String firstVertex, secondVertex; int flag = 0; System.out.println("Enter first end vertex"); firstVertex = sc.next(); if (obj.H.containsKey(firstVertex)) { System.out.println("Enter second end vertex"); secondVertex = sc.next(); if (obj.H.containsKey(secondVertex)) { flag = search(obj, firstVertex, secondVertex); if (flag == 1) { System.out.println("edge is present"); return; } } else { System.out.println("Invalid second vertex"); return; } } else { System.out.println("Invalid first vertex"); return; } if (flag == 0) { System.out.println("edge is not present"); } } static void searchvertex(Graph obj, Scanner sc) { String vertex; System.out.println("Enter a vertex"); vertex = sc.next(); if (obj.H.containsKey(vertex)) { System.out.println("vertex present"); } else { System.out.println("vertex not present"); } } static void deletevertex(Graph obj, Scanner sc) { String vertex; System.out.println("Enter a vertex"); vertex = sc.next(); if (obj.H.containsKey(vertex)) { LinkedList<Edge> edge =obj.H.get(vertex); edgeCount = edgeCount - edge.size(); Iterator<Edge> str = edge.iterator(); while (str.hasNext()) { LinkedList<Edge> edgeList = obj.H.get(str.next().edge); iteratoredgedelete(edgeList,vertex); str.remove(); } obj.H.remove(vertex); vertexCount--; } else { System.out.println("vertex not present"); } } static void deleteedge(Graph obj, Scanner sc) { String firstVertex, secondVertex; System.out.println("Enter first end vertex"); firstVertex = sc.next(); if (obj.H.containsKey(firstVertex)) { System.out.println("Enter second end vertex"); secondVertex = sc.next(); if (obj.H.containsKey(secondVertex)) { int flag = search(obj, firstVertex, secondVertex); if (flag == 1) { LinkedList<Edge> edgeList = obj.H.get(firstVertex); iteratoredgedelete(edgeList,secondVertex); edgeList = obj.H.get(secondVertex); iteratoredgedelete(edgeList,firstVertex); } else { System.out.println("edge not present"); } } else { System.out.println("invalid second vertex"); } } else { System.out.println("invalid first vertex"); } } static void del(Graph obj) { Set<String> vertices = obj.H.keySet(); for (String vertex : vertices) obj.H.remove(vertex); } static int search(Graph obj, String firstVertex, String secondVertex) { int flag = 0; LinkedList<Edge> edgeList = obj.H.get(firstVertex); for (Edge edge : edgeList) { if (edge.edge.equals(secondVertex)) { flag = 1; break; } } return flag; } static LinkedList<Edge> edgelistinsert(Graph obj,String currentVertex, LinkedList<String> vertex, Scanner scan) { int flag = 0; String input,secondVertex; LinkedList<Edge> edgeList; if(obj.H.get(currentVertex) !=null) { edgeList=obj.H.get(currentVertex); } else { edgeList=new LinkedList<>(); } do { System.out.println("Is There any vertex coming out from vertex " + currentVertex + " press Y or N"); input = scan.next(); if (input.equals("Y")) { System.out.println("enter the other end vertex coming out from " + currentVertex); secondVertex = scan.next(); flag=checkduplicate(edgeList,secondVertex); if (flag != 1) { if (vertex.contains(secondVertex)) { Edge temp2 = new Edge(); temp2.edge = secondVertex; edgeList.add(temp2); insideinsert(obj,secondVertex,currentVertex); edgeCount=edgeCount+2; } else { System.out.println("Invalid vertex"); } } else System.out.println("Duplicate vertex not allowed"); } } while (!(input.equals("N"))); return edgeList; } static int checkduplicate(LinkedList<Edge> edgeList, String edge) { for (Edge temp : edgeList) { if (temp.edge.equals(edge)) { return 1; } } return 0; } static void iteratoredgedelete(LinkedList<Edge> edgeList,String vertex) { Iterator<Edge> iterator = edgeList.iterator(); while (iterator.hasNext()) { if (iterator.next().edge.equals(vertex)) { iterator.remove(); edgeCount--; break; } } } static void insideinsert(Graph obj,String secondVertex ,String currentVertex ) { if(obj.H.containsKey(secondVertex) ) { Edge edge = new Edge(); edge.edge= currentVertex; obj.H.get(secondVertex).add(edge); } else { LinkedList<Edge> insideEdge = new LinkedList<>(); Edge edge = new Edge(); edge.edge= currentVertex; insideEdge.add(edge); obj.H.put(secondVertex, insideEdge); } } }





