公告

👇 微信 👇

图片

欢迎私信交流

Skip to content

8-Floyd算法 ​

算法思想 ​

算法模板 ​

java
import java.util.*;

public class Main {
    static int N = 210, M = 20010, INF = 0x3f3f3f3f;
    static int n, m, k;
    // d[i][j] 存储 i 号点到 j 号点的最短距离
    static int[][] d = new int[N][N];

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();
        k = in.nextInt();
        
        for(int i = 1; i <= n; i ++ )
            for(int j = 1; j <= n; j ++ )
                if(i == j) d[i][j] = 0;
                else d[i][j] = INF;
        
        while(m -- > 0)
        {
            int from = in.nextInt(), to = in.nextInt(), weight = in.nextInt();
            if(from == to) continue;
            d[from][to] = Math.min(d[from][to], weight);
        }
        
        floyd();
        
        while(k -- > 0)
        {
            int x = in.nextInt(), y = in.nextInt();
            var res = (d[x][y] > INF / 2) ? "impossible" : String.valueOf(d[x][y]);
            System.out.println(res);
        }
    }
	// d[k, i, j] 表示从 i 号点到 j 号点,只经过部分点集(1 ~ k 号点)的最短距离
	// d[k, i, j] = d[k - 1, i, k] + d[k - 1, k, j]
	// k, k-1 不参与运算,省略可得
	// d[i, j] = d[i, k] + d[k, j]
    static void floyd()
    {
        for(int k = 1; k <= n; k ++ )
            for(int i = 1; i <= n; i ++ )
                for(int j = 1; j <= n; j ++ )
                    d[i][j] = Math.min(d[i][j], d[i][k] + d[k][j]);
    }
}