joseiedo
Graph Algorithms
Overview

Graph Algorithms

January 16, 2026
3 min read

Bellman-Ford

import java.util.Arrays;
import java.util.List;
public int[] bellmanFord(int n, List<int[]> edges, int source) {
int[] distances = new int[n];
Arrays.fill(distances, Integer.MAX_VALUE);
distances[source] = 0;
for (int i = 0; i < n - 1; i++) {
for (int[] edge : edges) {
int u = edge[0];
int v = edge[1];
int w = edge[2];
if (distances[u] != Integer.MAX_VALUE && distances[u] + w < distances[v]) {
distances[v] = distances[u] + w;
}
}
}
for (int[] edge : edges) {
int u = edge[0];
int v = edge[1];
int w = edge[2];
if (distances[u] != Integer.MAX_VALUE && distances[u] + w < distances[v]) {
return new int[]{};
}
}
return distances;
}

BFS

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
public int fn(int[][] graph) {
Queue<Integer> que = new LinkedList<>();
Set<Integer> seen = new HashSet<>();
que.offer(START_NODE);
seen.add(START_NODE);
int ans = 0;
while (!que.isEmpty()) {
int node = que.remove();
// TODO: Logic
for (int neighbor: graph[node]) {
if (!seen.contains(neighbor)) {
seen.add(neighbor);
que.add(neighbor);
}
}
}
return ans;
}

DFS Iterative

import java.util.Stack;
import java.util.HashSet;
import java.util.Set;
public int fn(int[][] graph) {
Stack<Integer> stack = new Stack<>();
Set<Integer> seen = new HashSet<>();
stack.push(START_NODE);
seen.add(START_NODE);
int ans = 0;
while (!stack.empty()) {
int node = stack.pop();
// TODO: logic
for (int neighbor: graph[node]) {
if (!seen.contains(neighbor)) {
seen.add(neighbor);
stack.push(neighbor);
}
}
}
return ans;
}

DFS Recursive

import java.util.HashSet;
import java.util.Set;
Set<Integer> seen = new HashSet<>();
public int fn(int[][] graph) {
seen.add(START_NODE);
return dfs(START_NODE, graph);
}
public int dfs(int node, int[][] graph) {
int ans = 0;
// TODO: logic
for (int neighbor: graph[node]) {
if (!seen.contains(neighbor)) {
seen.add(neighbor);
ans += dfs(neighbor, graph);
}
}
return ans;
}

Dijkstra’s Algorithm

import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.List;
public int[] dijkstras(List<List<int[]>> graph, int source) {
int n = graph.size();
int[] distances = new int[n];
Arrays.fill(distances, Integer.MAX_VALUE);
distances[source] = 0;
PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));
pq.offer(new int[]{source, 0});
while (!pq.isEmpty()) {
int[] curr = pq.poll();
int node = curr[0];
int dist = curr[1];
if (dist > distances[node]) {
continue;
}
for (int[] edge : graph.get(node)) {
int neighbor = edge[0];
int weight = edge[1];
int newDist = dist + weight;
if (newDist < distances[neighbor]) {
distances[neighbor] = newDist;
pq.offer(new int[]{neighbor, newDist});
}
}
}
return distances;
}

Kahn’s Algorithm (Topological Sort)

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
public static List<Integer> kahnTopologicalSort(Map<Integer, List<Integer>> graph) {
List<Integer> result = new ArrayList<>();
Map<Integer, Integer> indegree = new HashMap<>();
Queue<Integer> que = new LinkedList<>();
for (List<Integer> vertices : graph.values()) {
for (int v : vertices) {
indegree.put(v, indegree.getOrDefault(v, 0) + 1);
}
}
for (Integer node : graph.keySet()) {
if (!indegree.containsKey(node)) {
que.offer(node);
}
}
while (!que.isEmpty()) {
int node = que.poll();
result.add(node);
if (graph.containsKey(node)) {
for (int neighbor : graph.get(node)) {
indegree.put(neighbor, indegree.get(neighbor) - 1);
if (indegree.get(neighbor) == 0) {
que.offer(neighbor);
}
}
}
}
if (result.size() != graph.size()) {
return new ArrayList<>();
}
return result;
}

Kruskal’s Algorithm (MST)

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public List<int[]> kruskalMST(int n, List<int[]> edges) {
List<int[]> mst = new ArrayList<>();
UnionFind uf = new UnionFind(n);
Collections.sort(edges, (a, b) -> Integer.compare(a[0], b[0]));
for (int[] edge : edges) {
int weight = edge[0];
int u = edge[1];
int v = edge[2];
if (!uf.connected(u, v)) {
uf.union(u, v);
mst.add(edge);
}
}
return mst;
}

Prim’s Algorithm (MST)

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
public List<int[]> primMST(int n, List<int[]> edges) {
List<int[]> mst = new ArrayList<>();
UnionFind uf = new UnionFind(n);
PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(edge -> edge[0]));
for (int[] edge : edges) {
pq.offer(edge);
}
while (!pq.isEmpty()) {
int[] edge = pq.poll();
int w = edge[0];
int u = edge[1];
int v = edge[2];
if (!uf.connected(u, v)) {
uf.union(u, v);
mst.add(edge);
}
}
return mst;
}