How to Implement Dijkstra’s Algorithm, BFS, and DFS in Java?


Graph Algorithms in Data Structures like Dijkstra’s Algorithm, BFS, and DFS are essential for solving shortest path, traversal, and connectivity problems in data structures. Dijkstra finds the shortest path, BFS explores level by level, and DFS explores deeply before backtracking.

In today’s world of AI, networking, and big data, graph algorithms power everything from Google Maps to social networks. Knowing Dijkstra, BFS, and DFS helps developers design efficient solutions for real-world problems like routing, recommendation engines, and network analysis.

Key Takeaways of Graph Algorithms in Java

AlgorithmKey IdeaBest For
DijkstraShortest pathGPS, weighted graphs
BFSLevel-order traversalShortest path in unweighted graphs
DFSDepth explorationCycle detection, topological sorting

Understanding Graph Algorithms in Java

What is Dijkstra’s Algorithm?

Explanation:
Dijkstra’s Algorithm is used to find the shortest path from a starting node to all other nodes in a weighted graph with non-negative edge weights. It’s widely used in navigation systems, network routing, and logistics.

Java Code Implementation:

import java.util.*;

class Dijkstra {
    static final int INF = Integer.MAX_VALUE;

    public static void dijkstra(int[][] graph, int start) {
        int n = graph.length;
        int[] dist = new int[n];
        boolean[] visited = new boolean[n];

        Arrays.fill(dist, INF);
        dist[start] = 0;

        for (int i = 0; i < n - 1; i++) {
            int u = minDistance(dist, visited);
            visited[u] = true;

            for (int v = 0; v < n; v++) {
                if (!visited[v] && graph[u][v] != 0 &&
                    dist[u] != INF &&
                    dist[u] + graph[u][v] < dist[v]) {
                    dist[v] = dist[u] + graph[u][v];
                }
            }
        }

        System.out.println("Shortest distances from node " + start + ": " + Arrays.toString(dist));
    }

    private static int minDistance(int[] dist, boolean[] visited) {
        int min = INF, minIndex = -1;
        for (int i = 0; i < dist.length; i++) {
            if (!visited[i] && dist[i] <= min) {
                min = dist[i];
                minIndex = i;
            }
        }
        return minIndex;
    }

    public static void main(String[] args) {
        int[][] graph = {
            {0, 4, 0, 0, 0, 0, 0, 8, 0},
            {4, 0, 8, 0, 0, 0, 0, 11, 0},
            {0, 8, 0, 7, 0, 4, 0, 0, 2},
            {0, 0, 7, 0, 9, 14, 0, 0, 0},
            {0, 0, 0, 9, 0, 10, 0, 0, 0},
            {0, 0, 4, 14, 10, 0, 2, 0, 0},
            {0, 0, 0, 0, 0, 2, 0, 1, 6},
            {8, 11, 0, 0, 0, 0, 1, 0, 7},
            {0, 0, 2, 0, 0, 0, 6, 7, 0}
        };
        dijkstra(graph, 0);
    }
}

What is BFS (Breadth-First Search)?

Explanation:
BFS explores a graph level by level, starting from a given node. It’s commonly used for:

  • Finding shortest path in unweighted graphs
  • Checking connectivity
  • Social network analysis

Java Code Example:

import java.util.*;

class BFSExample {
    public static void bfs(int start, List<List<Integer>> graph) {
        boolean[] visited = new boolean[graph.size()];
        Queue<Integer> queue = new LinkedList<>();
        queue.add(start);
        visited[start] = true;

        while (!queue.isEmpty()) {
            int node = queue.poll();
            System.out.print(node + " ");

            for (int neighbor : graph.get(node)) {
                if (!visited[neighbor]) {
                    visited[neighbor] = true;
                    queue.add(neighbor);
                }
            }
        }
    }

    public static void main(String[] args) {
        List<List<Integer>> graph = new ArrayList<>();
        for (int i = 0; i < 5; i++) graph.add(new ArrayList<>());

        graph.get(0).addAll(Arrays.asList(1, 2));
        graph.get(1).addAll(Arrays.asList(0, 3, 4));
        graph.get(2).addAll(Arrays.asList(0, 4));
        graph.get(3).addAll(Arrays.asList(1, 4));
        graph.get(4).addAll(Arrays.asList(1, 2, 3));

        System.out.print("BFS traversal starting from node 0: ");
        bfs(0, graph);
    }
}

What is DFS (Depth-First Search)?

Explanation:
DFS explores a graph deeply along each branch before backtracking. It’s useful for:

  • Cycle detection
  • Topological sorting
  • Pathfinding in mazes

Java Code Snippet:

import java.util.*;

class DFSExample {
    public static void dfs(int node, boolean[] visited, List<List<Integer>> graph) {
        visited[node] = true;
        System.out.print(node + " ");

        for (int neighbor : graph.get(node)) {
            if (!visited[neighbor]) {
                dfs(neighbor, visited, graph);
            }
        }
    }

    public static void main(String[] args) {
        List<List<Integer>> graph = new ArrayList<>();
        for (int i = 0; i < 5; i++) graph.add(new ArrayList<>());

        graph.get(0).addAll(Arrays.asList(1, 2));
        graph.get(1).addAll(Arrays.asList(0, 3, 4));
        graph.get(2).addAll(Arrays.asList(0, 4));
        graph.get(3).addAll(Arrays.asList(1, 4));
        graph.get(4).addAll(Arrays.asList(1, 2, 3));

        boolean[] visited = new boolean[graph.size()];
        System.out.print("DFS traversal starting from node 0: ");
        dfs(0, visited, graph);
    }
}

Real-life Applications of Graph Algorithms in Java

  • Google Maps: Uses Dijkstra to calculate shortest driving routes.
  • Social Networks: Use BFS to suggest friends and analyze connections.
  • Compiler Design: Uses DFS for dependency resolution, topological sorting, and cycle detection.
  • AI & Games: DFS is used in pathfinding, puzzles, and decision trees.

Pros & Cons of Graph Algorithms in Data Structures in Java

AlgorithmProsCons
DijkstraShortest path in weighted graphsDoesn’t handle negative weights
BFSShortest path in unweighted graphsMemory intensive for large graphs
DFSSimple and memory efficientMay not find the shortest path

Practical Value: How Companies Use Graph Algorithms in Java

Graph algorithms in Java are widely used in industries for routing, recommendation systems, and network analysis. Here are some practical examples:

1. Google Maps – Shortest Path Routing (Dijkstra’s Algorithm)

  • Problem: Optimize driving routes between multiple locations.
  • Solution: Google uses algorithms like Dijkstra to calculate the shortest path in weighted graphs representing road networks.
  • Java Implementation (Simplified Example):
int[][] roads = {
    {0, 10, 0, 30, 100},
    {10, 0, 50, 0, 0},
    {0, 50, 0, 20, 10},
    {30, 0, 20, 0, 60},
    {100, 0, 10, 60, 0}
};
Dijkstra.dijkstra(roads, 0);
  • Outcome: Optimized routes, faster travel time, and reduced congestion.

2. Facebook – Friend Suggestions (BFS Algorithm)

  • Problem: Recommend friends by exploring social connections.
  • Solution: Facebook uses BFS to traverse friend networks and find connections within a certain distance.
  • Java Implementation (Simplified Example):
List<List<Integer>> socialGraph = new ArrayList<>();
for (int i = 0; i < 5; i++) socialGraph.add(new ArrayList<>());

socialGraph.get(0).addAll(Arrays.asList(1, 2));
socialGraph.get(1).addAll(Arrays.asList(0, 3));
socialGraph.get(2).addAll(Arrays.asList(0, 4));
socialGraph.get(3).addAll(Arrays.asList(1));
socialGraph.get(4).addAll(Arrays.asList(2));

BFSExample.bfs(0, socialGraph);
  • Outcome: Accurate friend suggestions and improved social engagement.

3. Netflix – Content Recommendation (DFS Algorithm)

  • Problem: Explore user preferences to suggest relevant movies/shows.
  • Solution: Netflix uses DFS to traverse user-item interaction graphs and find hidden patterns or clusters.
  • Java Implementation (Simplified Example):
List<List<Integer>> contentGraph = new ArrayList<>();
for (int i = 0; i < 5; i++) contentGraph.add(new ArrayList<>());

contentGraph.get(0).addAll(Arrays.asList(1, 2));
contentGraph.get(1).addAll(Arrays.asList(0, 3));
contentGraph.get(2).addAll(Arrays.asList(0, 4));
contentGraph.get(3).addAll(Arrays.asList(1));
contentGraph.get(4).addAll(Arrays.asList(2));

boolean[] visited = new boolean[contentGraph.size()];
DFSExample.dfs(0, visited, contentGraph);
  • Outcome: Personalized recommendations, increased watch time, and higher user satisfaction.

Key Takeaways from Practical Use

CompanyAlgorithm UsedPurposeOutcome
GoogleDijkstraShortest path for routesReduced travel time, optimized routes
FacebookBFSFriend suggestionAccurate social connections, engagement
NetflixDFSContent recommendationPersonalized recommendations, higher retention

FAQ: Graph Algorithms in Java

1. Why can’t Dijkstra’s Algorithm handle negative edge weights?

Most competitors just say “it doesn’t work with negative weights” without explaining why.

Answer:
Dijkstra assumes that once a node’s shortest distance is finalized, it cannot be improved. Negative weights can reduce distances after a node is visited, which breaks this assumption. For graphs with negative weights, use Bellman-Ford Algorithm, which correctly recalculates paths even when edges subtract from total distance.

2. Is BFS always better than DFS for finding shortest paths?

Many sources incorrectly imply BFS is always better.

Answer:
BFS finds the shortest path only in unweighted graphs because each edge has equal cost. For weighted graphs, BFS fails to account for edge weights. Dijkstra or A* are required for accurate shortest paths in weighted networks.

3. How do social networks use BFS for friend suggestions?

Competitors often just say “BFS finds friends” without detail.

Answer:
BFS explores friends level by level: first-degree friends, second-degree friends (friends of friends), and so on. By limiting BFS depth and analyzing mutual connections, platforms rank and recommend potential friends efficiently. This also helps detect communities and social clusters.

4. Can DFS be used for pathfinding like BFS and Dijkstra?

Many blogs skip explaining DFS’s practical limitations.

Answer:
DFS can find a path between nodes, but it does not guarantee the shortest path. DFS explores deeply, which might lead to longer routes or missed optimal paths. Use DFS when your goal is complete exploration, cycle detection, or topological ordering, not shortest paths.

5. What is the time complexity difference between BFS, DFS, and Dijkstra?

Competitors often give vague answers without clarifying graph types or representations.

Answer:

  • BFS & DFS: O(V + E) using adjacency list (V = vertices, E = edges). Works for both connected and disconnected graphs.
  • Dijkstra: O((V + E) log V) using priority queue (heap). More efficient on sparse graphs; less efficient on dense graphs compared to BFS/DFS.
  • Key Insight: Complexity depends on graph representation. Adjacency matrix increases BFS/DFS to O(V²) due to full-row scans.

6. How to choose between BFS, DFS, and Dijkstra in real projects?

Most answers are generic.

Answer:

  • BFS: Use for shortest path in unweighted graphs, level-order traversal, or social network analysis.
  • DFS: Use for cycle detection, maze solving, topological sort, or AI search.
  • Dijkstra: Use for weighted graphs when shortest path matters, e.g., navigation systems or network routing.

Our AI-powered java online compiler lets you write, run, and test code instantly. No more waiting—you’ll see instant feedback, helping you learn and correct mistakes on the fly. It’s like having a coding tutor right there with you, guiding your Java coding journey.

Conclusion

Graph Algorithms in Java significantly boost your problem-solving skills and logical thinking. You’ll feel the thrill of tackling complex challenges. Give it a go; it’s rewarding! For an even richer experience, explore programming languages like Java, Python, C, and more with Newtum.

Download our free cheat sheet of 1must-know graph algorithms for coding interviews.

Edited and Compiled by

This article was compiled and edited by @rasikadeshpande, who has over 4 years of experience in writing. She’s passionate about helping beginners understand technical topics in a more interactive way.

About The Author