This post presents the code snippets for some simple graph processing tasks. Preferred Language in Java.
Tasks
- Connectvity:Given a graph, support queries of the form: Are two given vertices connected?
- Finding Path: Given a graph, vertex v and vertex w , support queries of the form Is there a path from v to w? If so, find such a path.
Task 1: Connectivity
Given a graph, support queries of the form: Are two given vertices connected?Two vertices are said to be connected, if there exists a path from one vertex to another vertex. We can find out connectivity by traversing the graph. This task is based on one of the graph traversal techniques:Depth First Search.
Let me present a brief overview of Depth First Search. To visit a vertex:
- Mark it as having visited.
- Visit (recursively) all the vertices that are adjacent to it and that have not been marked.
GraphUtils.java
The Graph API, we have used in the above class is explained in my previous post. In the above method isConnected(Graph g, int v, int w, boolean[] marked), g is the graph to check if two vertices are connected, v is the source vertex and u is destination vertex, and marked is the boolean array. This array is used to keep track, if a vertex is visited, while traversing the graph. Default values of this array are false.public class GraphUtils {
public static boolean isConnected(Graph g, int v, int w, boolean[] marked) {
boolean isConnected = false;
if (v == w) {
isConnected = true;
} else {
for (int u : g.adjacentVertices(v)) {
if (!marked[u]) {
marked[u] = true;
isConnected = isConnected(g, u, w, marked);
if (isConnected) {
break;
}
}
}
}
return isConnected;
}
}
Following is the demo for the above method.
DemoGraph.java
public class DemoGraph {
public static void main(String[] args) {
Graph g = new Graph("<File location>"); // you can find the sample input file in my previous post
System.out.println(g.toString());
System.out.println("Connectivity of Vertices " + 0 + " and " + 4 + ":"
+ GraphUtils.isConnected(g, 0, 4, new boolean[g.V()]));
}
}
====Output====
13 vertices, 13 edges
0: 5 1 2 6
1: 0
2: 0
3: 4 5
4: 3 6 5
5: 0 4 3
6: 4 0
7: 8
8: 7
9: 12 10 11
10: 9
11: 12 9
12: 9 11
Connectivity of Vertices 0 and 4:true
Task 2: Finding path
Given a graph, vertex v and vertex w , support queries of the form Is there a path from v to w? If so, find such a path.This task is similar to task 1, as it based on DFS. Only difference is that, we construct path recursively every time we visit a new vertex.
Let us add a new method called findPath(Graph g, int v, int w, boolean[] marked) , which returns path if the vertices v and w are connected; Otherwise <NO PATH>;
GraphUtils.java
public class GraphUtils {
public static String findPath(Graph g, int v, int w, boolean[] marked) {Following is the demo for the above method.
marked[v] = true;
String path = findPath(g, v, w, marked, null);
return path != null ? String.valueOf(v) + path : "<NO PATH>";
}
private static String findPath(Graph g, int v, int w, boolean[] marked,
String path) {
if (v == w) {
path = "";
}
else {
for (int u : g.adjacentVertices(v)) {
if (!marked[u]) {
marked[u] = true;
path = findPath(g, u, w, marked, path);
if (path != null) {
path = "-" + String.valueOf(u) + path;
break;
}
}
}
}
return path;
}
}
DemoGraph.java
public class DemoGraph {
public static void main(String[] args) {
Graph g = new Graph("<File location>"); // you can find the sample input file in my previous post
System.out.println(g.toString());
int v = 4;
int w = 0;
System.out.println("Path between " + v + " and " + w + " is: "
+ GraphUtils.findPath(g, v, w, new boolean[g.V()]));
v = 4;
w = 9;
System.out.println("Path between " + v + " and " + w + " is: "
+ GraphUtils.findPath(g, v, w, new boolean[g.V()]));
}
}
====Output====
13 vertices, 13 edges
0: 5 1 2 6
1: 0
2: 0
3: 4 5
4: 3 6 5
5: 0 4 3
6: 4 0
7: 8
8: 7
9: 12 10 11
10: 9
11: 12 9
12: 9 11
Path between 4 and 0 is: 4-3-5-0
Path between 4 and 9 is: <NO PATH>
Feel free to let me know, if there are any bugs!