首页 > 其他分享 >luogu P1772 [ZJOI2006] 物流运输 (dp, 最短路)

luogu P1772 [ZJOI2006] 物流运输 (dp, 最短路)

时间:2022-09-26 18:24:58浏览次数:86  
标签:dist int luogu st eds P1772 ZJOI2006 const dp

https://www.luogu.com.cn/problem/P1772

虽然是图论背景,但是1-n天之间是线性关系。没法贪心决策,考虑dp:
我本来写的dp是i-1转移到i,但是这样没法处理哪一天能走哪些最短路
需要改一下dp的转移:
连续几天走相同的路径相当于直接跳过这几天,那就是经典的线性不连续转移
f[i] = min(f[i], f[j] + cost[j + 1][i] * (i - j) + K);
这样i - j的最短路可以算出

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false) ,cin.tie(0), cout.tie(0);
//#pragma GCC optimize(3,"Ofast","inline")
#define ll long long
#define PII pair<int, int>
//#define int long long
const int N = 1e5 + 5;
const int M = 5e5 + 5;
const int INF = 0x3f3f3f3f;
const ll LNF = 0x3f3f3f3f3f3f3f3f;
const int mod = 998244353;
const double PI = acos(-1.0);
struct Edge {
    int u, v, w;
} eds[205];
struct Day {
    int p, a, b;
}day[205];

int h[205], e[205 << 1], ne[205 << 1], w[205 << 1], idx;
bool st[205];

int dist[25]; int m;
ll cost[105][105], f[105]; 
void add( int a, int b, int c) {
    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++;
}
int spfa() {
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    queue<int> q;
    q.push(1); st[1] = 1;
     while (q.size())
    {
        auto t = q.front();
        q.pop();

        st[t] = false;

        for (int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (dist[j] > dist[t] + w[i])
            {
                dist[j] = dist[t] + w[i];
                if (!st[j])
                {
                    q.push(j);
                    st[j] = true;
                }
            }
        }
    }
    return dist[m];
}
int main() {
    IOS
    int n, K, e, d; cin >> n >> m >> K >> e;
    for ( int i = 1; i <= e; ++ i ) {
        cin >> eds[i].u >> eds[i].v >> eds[i].w;
    }
    cin >> d;
    for( int i = 1; i <= d; ++ i) {
        int p, a, b; cin >> p >> a >> b;
        day[i] = {p, a, b};
    }
    for ( int i = 1; i <= n; ++ i ) {
        for ( int j = i; j <= n; ++ j ) {
            memset(h, -1, sizeof h); memset(st, 0, sizeof st); idx = 0;

            for (int k = 1; k <= d; ++ k) {
                int p = day[k].p, a = day[k].a, b = day[k].b;
                if( b < i || a > j ) {}
                else {st[p] = 1; }
            }

            for ( int k = 1; k <= e; ++ k ) {
                if(!st[eds[k].u] && !st[eds[k].v]) {
                    add(eds[k].u, eds[k].v, eds[k].w);
                    add(eds[k].v, eds[k].u, eds[k].w);
                }
            }
            cost[i][j] = spfa();
        }
    }

    for ( int i = 1; i <= 100; ++ i ) f[i] = 1e18;
    f[0] = -K;
    for ( int i = 1; i <= n; ++ i ) {
        for ( int j = 0; j < i; ++ j ) {
            f[i] = min(f[i], f[j] + cost[j + 1][i] * (i - j) + K);
           // cout << j << " " << i << " " << f[i] << '\n';
        }
    }
    cout << f[n] << '\n';
    return 0;
}

标签:dist,int,luogu,st,eds,P1772,ZJOI2006,const,dp
From: https://www.cnblogs.com/muscletear/p/16731892.html

相关文章

  • luogu P1410 子序列
    子序列题目描述给定一个长度为\(N\)(\(N\)为偶数)的序列,问能否将其划分为两个长度为\(N/2\)的严格递增子序列。输入格式若干行,每行表示一组数据。对于每组数据,首......
  • 【luogu P4218】珠宝商(SAM)(点分治)(根号分治)
    珠宝商题目链接:luoguP4218题目大意给你一棵树,每个点有一个字符。再给你一个字符串s。然后问你树上的所有简单的路径在s上的出现次数的和。思路一个比较神奇的题......
  • luogu P7632 题解
    一.思路我们可以先把时间换成以秒为单位的,然后在枚举每一秒时谁领先。二.重要点我们可以用string读入时间,再用一个函数以秒为单位提取出来(在程序中的函数名:tiqu)......
  • luogu 4025
    [PA2014]Bohater题目描述在一款电脑游戏中,你需要打败\(n\)只怪物(从\(1\)到\(n\)编号)。为了打败第\(i\)只怪物,你需要消耗\(d_i\)点生命值,但怪物死后会掉落血药......
  • luogu6927
    [ICPC2016WF]SwapSpace题面翻译你有\(n\)个硬盘\((n\leqslant10^{6})\),现在需要对所有硬盘进行格式化。格式化后,第\(i\)个硬盘的容量会由原来的\(a_{i}\)变为\(......
  • Luogu T273083 新的题目 题解
    怕放洛谷有人看,就搬过来了。本题解提供一个\(O(qn)\)的做法(实际上是暴力的优化)。先考虑暴力求解。对于每个操作,要求代价\(W\times(\sum_{i\inX}^{i}w[i]\times......
  • luogu 将会臭名昭著(
    ......
  • Luogu P4139 上帝与集合的正确用法
    \(\large{题目链接}\)\(\\\)首先介绍一下欧拉定理:\[a^{\varphi(p)}\equiv1\pmod{p},\gcd(a,p)=1\]\(\\\)所以费马小定理其实是欧拉定理的一种特殊情况,即\(p\)为质数......
  • Luogu P3674 小清新人渣的本愿 题解
    P3674小清新人渣的本愿lxl大爷的题,%%%%%以及CSPrp++!!!前言:其实是这题的名字吸引了我,毕竟人渣的本愿里的角色我觉得多多少少都沾点,哪来的小清新啊。《人渣的本愿》,又名......
  • 【luogu P5826】【模板】子序列自动机
    【模板】子序列自动机题目链接:luoguP5826题目大意给你一个序列,每次再给你一个序列,问你新的序列是不是一开始的序列的子序列。思路如果字符少不难想象到一个\(f_{i,j......