力扣787.K 站中轉內最便宜的航班

lizhiyu333發表於2020-12-05

有 n 個城市通過 m 個航班連線。每個航班都從城市 u 開始,以價格 w 抵達 v。

現在給定所有的城市和航班,以及出發城市 src 和目的地 dst,你的任務是找到從 src 到 dst 最多經過 k 站中轉的最便宜的價格。 如果沒有這樣的路線,則輸出 -1。

#define MIN(x, y) ((x) < (y)) ? (x) : (y)
int findCheapestPrice(int n, int** flights, int flightsSize, int* flightsColSize, int src, int dst, int K)
{
    if(n==2)
    {
        if(flights[0][0]==src)
        {
            return flights[0][2];
        }
        else
        {
            return -1;
        }
    }
    int dp[n*(n-1)/2][K+2];
    int i,j,k,min=INT_MAX;
    for(i=0;i<n*(n-1)/2;i++)
    {
        for(j=0;j<=K+1;j++)
        {
            dp[i][j]=INT_MAX;
        }
    }
    for(i=0;i<=K+1;i++)
    {
        dp[src][i]=0;
    }
        for(k=1;k<=K+1;k++)
        {
            for(j=0;j<flightsSize;j++)
            {
                if(dp[flights[j][0]][k-1]!=INT_MAX)
                {
                    dp[flights[j][1]][k]=MIN(dp[flights[j][1]][k],dp[flights[j][0]][k-1]+flights                      [j][2]);
                }
            }
        }
    for(k=1;k<=K+1;k++)
    {
        if(min>dp[dst][k])
        {
            min = dp[dst][k];
        }
    }
    if(min==INT_MAX)
    {
        min=-1;
    }
    return min;
}

相關文章