787. K 站中转内最便宜的航班(dp)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了787. K 站中转内最便宜的航班(dp)相关的知识,希望对你有一定的参考价值。

787. K 站中转内最便宜的航班(dp)

D A G DAG DAG图直接开二维数组 d p dp dp

d p ( i , j ) dp(i,j) dp(i,j)到达 i i i经过 j j j站的最小费用。

然后直接转移就行了。

class Solution {
private:
    static constexpr int INF = 10000 * 101 + 1;

public:
    int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int k) {
        vector<vector<int>> f(k + 2, vector<int>(n, INF));
        f[0][src] = 0;
        for (int t = 1; t <= k + 1; ++t) {
            for (auto&& flight: flights) {
                int j = flight[0], i = flight[1], cost = flight[2];
                f[t][i] = min(f[t][i], f[t - 1][j] + cost);
            }
        }
        int ans = INF;
        for (int t = 1; t <= k + 1; ++t) {
            ans = min(ans, f[t][dst]);
        }
        return (ans == INF ? -1 : ans);
    }
};

也可以直接上最短路跑 d p dp dp,这里的spfa不能标记,因为是二维的。

const int N=105,inf=0x3f3f3f3f;
#define mst(a,b) memset(a,b,sizeof a)
#define fi first
#define se second
class Solution {
public:

    int h[N],cnt,vis[N];
    int d[N][N];
    struct edge{
        int to,nt,w;
    }e[N*N];
    void add(int u,int v,int w){
        e[++cnt]={v,h[u],w},h[u]=cnt;
    }
    void spfa(int st,int n,int k){
        queue< pair<int,int> >q;mst(vis,0);
        for(int i=0;i<=n;i++)
            for(int j=0;j<=k;j++) d[i][j]=inf;
        d[st][0]=0;
        q.push({st,0});
        while(!q.empty()){
            auto u=q.front();
            q.pop();
           // printf("(%d,%d)\\n",u.fi,u.se);
            if(u.se>=k) continue;
            for(int i=h[u.fi];~i;i=e[i].nt){
                int v=e[i].to,w=e[i].w;
                if(d[v][u.se+1]>d[u.fi][u.se]+w){
                    d[v][u.se+1]=d[u.fi][u.se]+w;
                     q.push({v,u.se+1}),vis[v]=1;
                }
            }
        }
    }
    int findCheapestPrice(int n, vector<vector<int>>& ve, int st, int ed, int k) {
        mst(h,-1);
        for(auto v:ve){
            add(v[0],v[1],v[2]);
        }
        spfa(st,n,k+1);
        int ans=inf;
        for(int i=0;i<=k+1;i++) ans=min(ans,d[ed][i]);
    //    printf("%d %d %d %d\\n",d[3][1],d[2][2],d[1][3],d[4][4]);
        return ans==inf?-1:ans;
    }
};

以上是关于787. K 站中转内最便宜的航班(dp)的主要内容,如果未能解决你的问题,请参考以下文章

[M最短路] lc787. K 站中转内最便宜的航班(Bellman-Ford算法模板+边数限制最短路+dp思想)

[M最短路] lc787. K 站中转内最便宜的航班(Bellman-Ford算法模板+边数限制最短路+dp思想)

LeetCode 787 K站中转内最便宜的航班[动态规划] HERODING的LeetCode之路

leetcode_787K 站中转内最便宜的航班

[leetcode] 787 K 站中转内最便宜的航班

LeetCode 789. 逃脱阻碍者(贪心) / 1646. 获取生成数组中的最大值 / 787. K 站中转内最便宜的航班(有限制的最短路,重新审视迪杰斯特拉,动态规划)