IntGraph

class IntGraph(size: Int, debugTimeUse: Boolean = false, isSparse: Boolean = false) : BaseGraph<Int>

A specialized graph class that represent integer nodes ranging from 0 to size-1.

The IntGraph class behaves a lot like the Graph class when used with integers. However, it's more performant, because it does not need to maintain an internal mapping between the nodes and their indexes in the adjacency list. The obvious drawback being it only supports integer nodes. It also requires the number of nodes to be defined at initialization.

Example usage:

val graph = IntGraph(3) // Creates a graph with nodes 0, 1 and 2
graph.addEdge(0, 1, 5.0)
graph.addEdge(0, 2, 2.0)
graph.addEdge(2, 1, 1.0)
graph.shortestPathsFrom(0, 1)
// NOTE: visualizeGraph() requires the smartgraph.css and smartgraph.properties files to be added to the root of your project.
graph.visualizeGraph() // Find the needed files here: https://github.com/Norskeaksel/GraphMateKT

Parameters

size

The number of nodes in the graph. Nodes are represented as integers from 0 to size-1.

debugTimeUse

optional flag that prints the time use of run algorithms to standard error

isSparse

If true, search results are stored in maps instead of arrays. More performant when searches only reach a small part of a large graph. Defaults to false.

Constructors

Link copied to clipboard
constructor(size: Int, debugTimeUse: Boolean = false, isSparse: Boolean = false)

Functions

Link copied to clipboard
fun addEdge(node1: Int, node2: Int, weight: Int)

Overloaded function that calls addEdge with weight converted to a double.

open override fun addEdge(node1: Int, node2: Int, weight: Double = 1.0)

Adds a directed edge from node1 to node2.

Link copied to clipboard
open override fun addNode(node: Int): Nothing

IntGraph doesn't support addNode(), because nodes are set on initialization.

Link copied to clipboard

Executes the Floyd-Warshall algorithm on the graph to compute the shortest paths between all pairs of nodes.

Link copied to clipboard
fun bfs(startNode: Int, target: Int? = null, reset: Boolean = true, maxDistance: Double = Double.POSITIVE_INFINITY)

Overload of fun bfs(startNodes: List, target: T?, reset: Boolean, maxDistance: Double) that accepts a single starting node instead of a list of starting nodes

fun bfs(startNodes: List<Int>, target: Int? = null, reset: Boolean = true, maxDistance: Double = Double.POSITIVE_INFINITY)

Performs a Breadth-First Search, which finds the shortest path from the starting node to all other nodes, assuming the graph is unweighted (all edges have a weight of 1.0) It stores results that can be retrieved with the following functions:

Link copied to clipboard

Removes all edges from the graph, including a rule defined by connectWithRule. Nodes and search results are kept.

Link copied to clipboard
fun connect(node1: Int, node2: Int)

Connects two nodes in the graph, by calling addEdge(node1,node2) and addEdge(node2, node1)

fun connect(node1: Int, node2: Int, weight: Double)

Connects two nodes in the graph, by calling addEdge(node1,node2, weight) and addEdge(node2, node1, weight)

fun connect(node1: Int, node2: Int, weight: Int)

Overloaded function that calls connect with weight converted to a double.

Link copied to clipboard
open fun connectWithRule(getNeighbours: (node: Int) -> List<Int>)

Defines a rule for how each node is connected to its neighbors.

Link copied to clipboard
Link copied to clipboard
fun depth(): Int

Retrieves the depth of the graph from the most recent search operation

Link copied to clipboard
fun dfs(startNode: Int, reset: Boolean = true)

Performs a Depth-First Search, which finds all nodes that's reachable from the starting node. It stores results that can be retrieved with the following functions:

Link copied to clipboard

Retrieves the shortest distance between two nodes in the graph.

Link copied to clipboard
fun distanceTo(node: Int): Double

Retrieves the distance to the specified node from the starting node of the most recent search operation (BFS, DFS, shortestPathsFrom).

Link copied to clipboard

fun edges(node: Int): List<Pair<Double, Int>>

Retrieves a list of edges connected to the specified node.

Link copied to clipboard
fun finalPath(): List<Int>?

Retrieves the shortest path from the start to target node (if a target was specified) during the most recent search operation (BFS, shortestPathsFrom). After topologicalSort(), it holds the topological ordering.

Link copied to clipboard
fun forEachNeighbour(node: Int, action: (Int) -> Unit)

Executes a given function on all the neighbours of a given node.

Link copied to clipboard

Checks if the target node was found during the most recent search operation (BFS, shortestPathsFrom).

Link copied to clipboard

Retrieves the node that is the farthest from the starting node in the most recent search operation (BFS, shortestPathsFrom).

Link copied to clipboard
fun getPath(target: Int): List<Int>?

Retrieves the path from the starting node to the specified target node based on the most recent search results.

Link copied to clipboard

Retrieves the maximum distance from the starting node to any other node after the most recent search operation (BFS, shortestPathsFrom).

Link copied to clipboard

Computes the Minimum Spanning Tree (MST) of the graph using Prim's algorithm.

Link copied to clipboard
fun neighbours(node: Int): List<Int>

Retrieves a list of the neighboring nodes of the specified node.

Link copied to clipboard
open override fun nodes(): List<Int>
Link copied to clipboard
fun nrOfEdges(): Int
Link copied to clipboard
fun nrOfPaths(startNode: Int, targetNode: Int, mod: Long = Long.MAX_VALUE): Long

Calculates the number of distinct paths from the starting node to the target node in the graph.

Link copied to clipboard
open fun print()

Prints the graph's adjacency list to the standard error stream.

Link copied to clipboard

Prints which nodes each node is connected to, to the standard error stream.

Link copied to clipboard

Clears the search results stored in the graph.

Link copied to clipboard
fun shortestPathsFrom(startNode: Int, target: Int? = null)

Performs Dijkstra's algorithm to find the shortest path from the starting node to all other nodes. It stores results that can be retrieved with the following functions:

Link copied to clipboard
fun size(): Int
Link copied to clipboard

Identifies groups where each node is reachable from every other node in the group.

Link copied to clipboard
open fun topologicalSort(): List<Int>

Builds an order of nodes so that the first nodes has no outgoing edges, then nodes with edges pointing to these and so on, assuming the graph is a Directed Acyclic Graph (DAG). This is done by running a DFS from each node and ordering the nodes by descending depth (post-order).

Link copied to clipboard
Link copied to clipboard
fun <T : Any> BaseGraph<T>.visualizeGraph(isBidirectional: Boolean = false, finalPath: List<T> = finalPath() ?: emptyList(), screenTitle: String = "Graph visualizer (Click space to pause and resume)", animationTicTimeOverride: Double? = null, closeOnEnd: Boolean = false, startPaused: Boolean = false)

Visualizes the graph with Bruno Silva's JavaFXSmartGraph library.