현재 위치: > 최신 기사 목록> PHP를 사용하여 Floyd-Warshall 알고리즘을 구현하여 그래프의 가장 짧은 경로 문제를 해결하는 방법

PHP를 사용하여 Floyd-Warshall 알고리즘을 구현하여 그래프의 가장 짧은 경로 문제를 해결하는 방법

M66 2025-06-21

PHP 알고리즘 설계 팁 : Floyd-Warshall 알고리즘을 사용하여 그래프의 가장 짧은 경로 문제를 해결하는 방법

그래프 이론에서 가장 짧은 경로 문제는 지시되지 않은 그래프 또는 방향이없는 그래프에서 두 정점 사이의 가장 짧은 경로를 찾는 것과 관련된 고전적인 알고리즘 문제입니다. Floyd-Warshall 알고리즘은이 문제를 해결하는 데 사용되는 전형적인 동적 프로그래밍 알고리즘입니다. 이 기사는 PHP를 사용하여 Floyd-Warshall 알고리즘을 구현하는 방법을 자세히 설명합니다.

Floyd-Warshall 알고리즘 소개

Floyd-Warshall 알고리즘은 그래프의 모든 정점 사이의 가장 짧은 경로 길이를 반복하여 가장 짧은 경로 문제를 해결하는 알고리즘입니다. 2 차원 배열을 사용하여 정점 사이에 가장 짧은 경로 길이를 저장하고 각 반복 에이 배열을 업데이트합니다. 마지막으로 모든 정점 사이에서 가장 짧은 경로를 얻을 수 있습니다.

PHP 코드 구현

먼저, 2D 배열의 n x n 배열을 만들어야하며, 여기서 n은 그래프의 정점 수를 나타냅니다. 배열의 각 요소는 두 정점 사이의 거리를 나타내며, 두 정점 사이에 가장자리가없는 경우 거리가 무한대로 설정됩니다. 다음은 PHP 코드 구현입니다.

함수 flydwarshall ($ 그래프) {
    $ n = count ($ 그래프);
    $ dist = $ 그래프;
    
    for ($ k = 0; $ k <$ n; $ k ++) {
        for ($ i = 0; $ i <$ n; $ i ++) {
            for ($ j = 0; $ j <$ n; $ j ++) {
                if ($ dist [$ i] [$ k] + $ dist [$ k] [$ j] <$ dist [$ i] [$ j]) {
                    $ dist [$ i] [$ j] = $ dist [$ i] [$ k] + $ dist [$ k] [$ j];
                }
            }
        }
    }
    return $ dist;
}

샘플 그래프 및 알고리즘 호출

다음으로 예제 그래프를 정의하고 알고리즘을 테스트합니다. 우리는 인접성 행렬을 사용하여 그래프의 구조를 나타내며, 정점 사이의 거리를 2 차원 배열에 저장합니다. 샘플 코드는 다음과 같습니다.

$ 그래프 = [
    [0, 5, inf, 10],
    [Inf, 0, 3, inf],
    [inf, inf, 0, 1],
    [Inf, Inf, Inf, 0]
];

위의 예제 다이어그램에서 INF는 두 정점 사이에 가장자리가 없으며 거리가 매우 큰 값으로 설정됩니다. 이제 Floydwarshall 함수를 호출하여 가장 짧은 경로 배열을 계산할 수 있습니다.

$ result = floydwarshall ($ 그래프);

출력 결과

위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

0 5 8 9 
INF 0 3 4 
Inf 0 1 
Inf inf 0

위의 결과는 그림의 모든 정점 사이의 가장 짧은 경로 길이를 보여줍니다. 여기서 Inf는 두 정점 사이에 경로 연결이 없다는 것을 의미합니다.

요약

이 기사는 PHP를 사용하여 Floyd-Warshall 알고리즘을 구현하여 그래프의 가장 짧은 경로 문제를 해결하는 방법을 소개합니다. 동적 프로그래밍이라는 아이디어를 사용하면 O의 시간 복잡성으로 그래프의 모든 정점 사이에서 가장 짧은 경로 길이를 찾을 수 있습니다 (n^3). 알고리즘 설계 기술을 합리적으로 사용함으로써 실제 문제를 해결하는 데이 알고리즘을 빠르고 효율적으로 적용 할 수 있습니다.