Home Backend Development Python Tutorial How to implement Floyd-Warshall algorithm in Python?

How to implement Floyd-Warshall algorithm in Python?

May 16, 2025 pm 12:12 PM
python

Implementing the Floyd-Warshall algorithm in Python can be done through the following steps: 1) Use basic triple loop implementation, suitable for small-scale graphs; 2) Use NumPy for optimization, suitable for large-scale graphs; 3) Detect negative rings to ensure the correct algorithm results; 4) Use sparse matrix optimization, suitable for large-scale sparse graphs.

How to implement Floyd-Warshall algorithm in Python?

Implementing the Floyd-Warshall algorithm in Python is an interesting and challenging task. This algorithm is used to find the shortest path between all vertex pairs in the graph, let's dive into how to implement it and share some practical experience.

Let's start with a simple implementation and gradually dive into more complex scenarios and optimization techniques.

 import sys

def floyd_warshall(graph):
    n = len(graph)
    dist = [[float('inf')] * n for _ in range(n)]

    # Initialize the distance matrix for i in range(n):
        for j in range(n):
            if i == j:
                dist[i][j] = 0
            elif graph[i][j] != 0:
                dist[i][j] = graph[i][j]

    # Implement the Floyd-Warshall algorithm for k in range(n):
        for i in range(n):
            for j in range(n):
                dist[i][j] = min(dist[i][j], dist[i][k] dist[k][j])

    return dist

# Example graph = [
    [0, 3, float('inf'), 7],
    [8, 0, 2, float('inf')],
    [5, float('inf'), 0, 1],
    [2, float('inf'), float('inf'), 0]
]

result = floyd_warshall(graph)
for row in result:
    print(row)

In this implementation, we first initialize the distance matrix and then implement the core logic of the Floyd-Warshall algorithm through triple loops. Although this approach is intuitive, it may encounter bottlenecks in time and space for large graphs.

Now, let's dive into some advanced usage and optimization tips.

For large graphs, we can consider using NumPy to accelerate the calculation. Vectorization operations of NumPy can significantly improve performance, especially when processing large-scale data.

 import numpy as np

def floyd_warshall_numpy(graph):
    n = len(graph)
    dist = np.full((n, n), np.inf)
    np.fill_diagonal(dist, 0)

    # Initialize the distance matrix for i in range(n):
        for j in range(n):
            if graph[i][j] != 0:
                dist[i, j] = graph[i][j]

    # Implement the Floyd-Warshall algorithm for k in range(n):
        dist = np.minimum(dist, dist[:, k, np.newaxis] dist[k])

    return dist

# Example graph = np.array([
    [0, 3, 0, 7],
    [8, 0, 2, 0],
    [5, 0, 0, 1],
    [2, 0, 0, 0]
])

result = floyd_warshall_numpy(graph)
print(result)

Versions using NumPy are not only more concise in code, but also perform better when processing large-scale data. However, it should be noted that NumPy's memory usage may be higher than pure Python implementations, especially for very large graphs.

In practical applications, we may encounter some common errors and debugging techniques. For example, there may be negative weight edges in the figure, which may lead to the existence of negative rings. In this case, the Floyd-Warshall algorithm may give wrong results. We can detect negative rings by checking whether diagonal elements become negative.

 def detect_negative_cycle(dist):
    n = len(dist)
    for i in range(n):
        if dist[i][i] < 0:
            return True
    return False

# Use the previous floyd_warshall function to calculate the distance matrix result = floyd_warshall(graph)
If detect_negative_cycle(result):
    print("There is a negative ring in the figure, and the shortest path cannot be calculated")
else:
    print("Shortest Path Matrix:")
    for row in result:
        print(row)

In terms of performance optimization, we can consider using sparse matrix to represent the graph, especially when the graph is very large and sparse. SciPy provides efficient sparse matrix operations that can significantly reduce memory usage.

 from scipy import sparse

def floyd_warshall_sparse(graph):
    n = graph.shape[0]
    dist = sparse.csr_matrix((n, n), dtype=np.float64)
    dist.setdiag(np.zeros(n))

    # Initialize the distance matrix dist = dist graph

    # Implement the Floyd-Warshall algorithm for k in range(n):
        dist = sparse.csr_matrix.minimum(dist, dist[:, k].reshape(-1, 1) dist[k])

    return dist

# Example graph = sparse.csr_matrix(np.array([
    [0, 3, 0, 7],
    [8, 0, 2, 0],
    [5, 0, 0, 1],
    [2, 0, 0, 0]
]))

result = floyd_warshall_sparse(graph)
print(result.toarray())

Versions using sparse matrices perform well when dealing with large-scale sparse graphs, but it should be noted that the operation of sparse matrices may be more complex than dense matrices, which may affect the readability of the code and the difficulty of debugging.

In actual projects, choosing the appropriate implementation method requires considering the size, density, and performance requirements of the graph. Through these different implementation and optimization techniques, we can better deal with challenges in various scenarios.

In short, the implementation of Floyd-Warshall algorithm in Python not only requires consideration of basic algorithm logic, but also requires optimization and adjustment in combination with various requirements in actual applications. I hope these sharing can help you better apply this algorithm in actual projects.

The above is the detailed content of How to implement Floyd-Warshall algorithm in Python?. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What are class methods in Python What are class methods in Python Aug 21, 2025 am 04:12 AM

ClassmethodsinPythonareboundtotheclassandnottoinstances,allowingthemtobecalledwithoutcreatinganobject.1.Theyaredefinedusingthe@classmethoddecoratorandtakeclsasthefirstparameter,referringtotheclassitself.2.Theycanaccessclassvariablesandarecommonlyused

python asyncio queue example python asyncio queue example Aug 21, 2025 am 02:13 AM

asyncio.Queue is a queue tool for secure communication between asynchronous tasks. 1. The producer adds data through awaitqueue.put(item), and the consumer uses awaitqueue.get() to obtain data; 2. For each item you process, you need to call queue.task_done() to wait for queue.join() to complete all tasks; 3. Use None as the end signal to notify the consumer to stop; 4. When multiple consumers, multiple end signals need to be sent or all tasks have been processed before canceling the task; 5. The queue supports setting maxsize limit capacity, put and get operations automatically suspend and do not block the event loop, and the program finally passes Canc

How to run a Python script and see the output in a separate panel in Sublime Text? How to run a Python script and see the output in a separate panel in Sublime Text? Aug 17, 2025 am 06:06 AM

ToseePythonoutputinaseparatepanelinSublimeText,usethebuilt-inbuildsystembysavingyourfilewitha.pyextensionandpressingCtrl B(orCmd B).2.EnsurethecorrectbuildsystemisselectedbygoingtoTools→BuildSystem→Pythonandconfirming"Python"ischecked.3.Ifn

How to use regular expressions with the re module in Python? How to use regular expressions with the re module in Python? Aug 22, 2025 am 07:07 AM

Regular expressions are implemented in Python through the re module for searching, matching and manipulating strings. 1. Use re.search() to find the first match in the entire string, re.match() only matches at the beginning of the string; 2. Use brackets() to capture the matching subgroups, which can be named to improve readability; 3. re.findall() returns all non-overlapping matches, and re.finditer() returns the iterator of the matching object; 4. re.sub() replaces the matching text and supports dynamic function replacement; 5. Common patterns include \d, \w, \s, etc., you can use re.IGNORECASE, re.MULTILINE, re.DOTALL, re

How to build and run Python in Sublime Text? How to build and run Python in Sublime Text? Aug 22, 2025 pm 03:37 PM

EnsurePythonisinstalledbyrunningpython--versionorpython3--versionintheterminal;ifnotinstalled,downloadfrompython.organdaddtoPATH.2.InSublimeText,gotoTools>BuildSystem>NewBuildSystem,replacecontentwith{"cmd":["python","-

How to use variables and data types in Python How to use variables and data types in Python Aug 20, 2025 am 02:07 AM

VariablesinPythonarecreatedbyassigningavalueusingthe=operator,anddatatypessuchasint,float,str,bool,andNoneTypedefinethekindofdatabeingstored,withPythonbeingdynamicallytypedsotypecheckingoccursatruntimeusingtype(),andwhilevariablescanbereassignedtodif

How to pass command-line arguments to a script in Python How to pass command-line arguments to a script in Python Aug 20, 2025 pm 01:50 PM

Usesys.argvforsimpleargumentaccess,whereargumentsaremanuallyhandledandnoautomaticvalidationorhelpisprovided.2.Useargparseforrobustinterfaces,asitsupportsautomatichelp,typechecking,optionalarguments,anddefaultvalues.3.argparseisrecommendedforcomplexsc

How to debug a remote Python application in VSCode How to debug a remote Python application in VSCode Aug 30, 2025 am 06:17 AM

To debug a remote Python application, you need to use debugpy and configure port forwarding and path mapping: First, install debugpy on the remote machine and modify the code to listen to port 5678, forward the remote port to the local area through the SSH tunnel, then configure "AttachtoRemotePython" in VSCode's launch.json and correctly set the localRoot and remoteRoot path mappings. Finally, start the application and connect to the debugger to realize remote breakpoint debugging, variable checking and code stepping. The entire process depends on debugpy, secure port forwarding and precise path matching.

See all articles