854. Floyd求最短路(模板)

給定一個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能爲負數。java

再給定k個詢問,每一個詢問包含兩個整數x和y,表示查詢從點x到點y的最短距離,若是路徑不存在,則輸出「impossible」。nginx

數據保證圖中不存在負權迴路。ui

輸入格式

第一行包含三個整數n,m,kspa

接下來m行,每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長爲z。code

接下來k行,每行包含兩個整數x,y,表示詢問點x到點y的最短距離。xml

輸出格式

共k行,每行輸出一個整數,表示詢問的結果,若詢問兩點間不存在路徑,則輸出「impossible」。blog

數據範圍

1n2001≤n≤200,
1kn21≤k≤n2
1m200001≤m≤20000,
圖中涉及邊長絕對值均不超過10000。
io

輸入樣例:

3 3 2
1 2 1
2 3 2
1 3 1
2 1
1 3

輸出樣例:

impossible 1

代碼:
//存在負邊,不存在負權迴路
import java.util.Scanner;

public class Main{
        static final int N=205, INF=0x3f3f3f3f;
        static int dp[][]=new int[N][N];
        static int n,m,q;
        static void Floyd(){
                for(int k=1;k<=n;k++)
                    for(int i=1;i<=n;i++)
                        for(int j=1;j<=n;j++)
                            dp[i][j]=Math.min(dp[i][j], dp[i][k]+dp[k][j]);
        }
         public static void main(String[] args) {
                 Scanner scan=new Scanner(System.in);
                 n=scan.nextInt();
                 m=scan.nextInt();
                 q=scan.nextInt();
                 for(int i=1;i<=n;i++)
                    for(int j=1;j<=n;j++)
                        if(i==j) dp[i][j]=0;//解決自環
                        else dp[i][j]=INF;
                 while(m-->0){
                         int a=scan.nextInt();
                         int b=scan.nextInt();
                         int w=scan.nextInt();
                         dp[a][b]=Math.min(dp[a][b], w);//解決重邊,重邊取小的
                 }
                 Floyd();
                 while(q-->0){
                         int a=scan.nextInt();
                         int b=scan.nextInt();
                         if(dp[a][b]>INF/2) System.out.println("impossible");//解決負邊
                         else System.out.println(dp[a][b]);
                 }
                     
        }
 }
相關文章
相關標籤/搜索