Java Graph Implementation
Comprehensive Graph Class Design
Core Graph Implementation
public class Graph {
private int[][] adjacencyMatrix;
private int numVertices;
// Constructor
public Graph(int vertices) {
this.numVertices = vertices;
this.adjacencyMatrix = new int[vertices][vertices];
}
// Add edge methods
public void addEdge(int source, int destination) {
validateVertices(source, destination);
adjacencyMatrix[source][destination] = 1;
}
public void addWeightedEdge(int source, int destination, int weight) {
validateVertices(source, destination);
adjacencyMatrix[source][destination] = weight;
}
}
Graph Traversal Algorithms
Depth-First Search (DFS)
public void depthFirstTraversal(int startVertex) {
boolean[] visited = new boolean[numVertices];
dfsRecursive(startVertex, visited);
}
private void dfsRecursive(int vertex, boolean[] visited) {
visited[vertex] = true;
System.out.print(vertex + " ");
for (int i = 0; i < numVertices; i++) {
if (adjacencyMatrix[vertex][i] > 0 && !visited[i]) {
dfsRecursive(i, visited);
}
}
}
Breadth-First Search (BFS)
public void breadthFirstTraversal(int startVertex) {
boolean[] visited = new boolean[numVertices];
Queue<Integer> queue = new LinkedList<>();
visited[startVertex] = true;
queue.add(startVertex);
while (!queue.isEmpty()) {
int current = queue.poll();
System.out.print(current + " ");
for (int i = 0; i < numVertices; i++) {
if (adjacencyMatrix[current][i] > 0 && !visited[i]) {
queue.add(i);
visited[i] = true;
}
}
}
}
Advanced Graph Operations
Dijkstra's Shortest Path Algorithm
public int[] dijkstraShortestPath(int sourceVertex) {
int[] distances = new int[numVertices];
boolean[] visited = new boolean[numVertices];
Arrays.fill(distances, Integer.MAX_VALUE);
distances[sourceVertex] = 0;
for (int count = 0; count < numVertices - 1; count++) {
int u = findMinimumDistance(distances, visited);
visited[u] = true;
for (int v = 0; v < numVertices; v++) {
if (!visited[v] &&
adjacencyMatrix[u][v] != 0 &&
distances[u] != Integer.MAX_VALUE &&
distances[u] + adjacencyMatrix[u][v] < distances[v]) {
distances[v] = distances[u] + adjacencyMatrix[u][v];
}
}
}
return distances;
}
Error Handling and Validation
private void validateVertices(int source, int destination) {
if (source < 0 || source >= numVertices ||
destination < 0 || destination >= numVertices) {
throw new IllegalArgumentException("Invalid vertex");
}
}
Operation |
Time Complexity |
Space Complexity |
Add Edge |
O(1) |
O(V²) |
Remove Edge |
O(1) |
O(V²) |
DFS |
O(V + E) |
O(V) |
BFS |
O(V + E) |
O(V) |
Dijkstra |
O(V²) |
O(V) |
Best Practices
- Use interfaces for flexibility
- Implement generic graph classes
- Consider memory efficiency
- Choose appropriate traversal method
At LabEx, we emphasize robust graph implementation techniques that balance performance and readability.