首页 > 其他分享 >Luogu1772 [ZJOI2006] 物流运输

Luogu1772 [ZJOI2006] 物流运输

时间:2023-05-06 22:14:20浏览次数:53  
标签:idx int Days st 物流 cost Luogu1772 ZJOI2006 dis

传送门

简化题意

给你 $m$ 个码头,码头之间有双向边连接,$n$ 天,其中一些码头在某些天会不可用,这 $n$ 天都要有一条从 $1$ 到 $m$ 的路,每一次更换道路会需要 $k$ 的代价,求这 $n$ 天每天从 $1$ 到 $m$ 的距离之和与更改道路的价值之和的最小值。

Solution

首先我们能想到一个贪心的策略:在保证最短路的同时,需要保证更换道路尽可能少。

然后0我们可以想到令 $cost_{i,j}$ 为从第 $i$ 天到第 $j$ 天走同一条路径的最短长度和,$f_i$ 为第 $i$ 天的 $ans$ 值,于是我们可以列出状态转移方程:
$$
f_i\ =\ \min \{ f_j + k + cost_{j + 1, i} \}
$$
接下来,我们来处理 $cost{i, j}$,我们发现只要 $x$ 号码头在 $i$ 到 $j$ 天封闭过一次,在 $i$ 到 $j$ 天的路径里就不能选它,所以只需要在跑最短路时判一下 $x$ 号点是否被封禁即可。

注:若 $i$ 到 $j$ 天不能从 $1$ 走到 $m$,就把 $const_{i,j}$ 赋值为 $INF$ 即可。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;

#define int long long // 不开longlong见祖宗
const int Days = 105, N = 25, M = 405;

int n, m, k, e, Q, x, y, w;
int la[N], en[M], ne[M], len[M], idx;
int dis[N], f[Days], cost[Days][Days];
bool st[N], lock[N], timlock[N][Days];
queue<int > q;

void add(int x, int y, int z) {
	en[ ++ idx] = y;
	ne[idx] = la[x];
	la[x] = idx;
	len[idx] = z;
}

void spfa(int l, int r) {
    memset(dis, 0x3f3f3f3f, sizeof dis);
    q.push(1), dis[1] = 0, st[1] = 1;
    while(q.size()) {
        int u = q.front();
        st[u] = 0; q.pop();
        for (int i = la[u]; i; i = ne[i]) {
            int v = en[i];
            if(lock[v]) continue;
            if(dis[v] > dis[u] + len[i]) {
                dis[v] = dis[u] + len[i];
                if(!st[v]) {
                    q.push(v);
                    st[v] = 1;
                }
            }
        }
    }
    cost[l][r] = (dis[m]>=0x3f3f3f3f3f3f3f3f ? 1 : r - l + 1) * dis[m];
}

signed main(){
	ios::sync_with_stdio(0);
	
	cin >> n >> m >> k >> e;
	while(e -- ) {
		cin >> x >> y >> w;
		add(x, y, w); add(y, x, w); // 注意是双向边
	}
	cin >> Q;
	while(Q -- ) {
		cin >> w >> x >> y;
		for (int i = x; i <= y; ++ i ) timlock[w][i] = 1; //打标记
	}
	
	for (int i = 1; i <= n; ++ i ) 
		for (int j = i; j <= n; ++ j ) {
			for (int l = 1; l <= m; ++ l )
				for (int tim = i; tim <= j; ++ tim ) {
					lock[l] |= timlock[l][tim];
					if(lock[l]) break;
				}
			spfa(i, j);
			for (int l = 1; l <= m; ++ l ) lock[l] = 0; //记得清空
		} 
	
	for (int i = 1; i <= n; ++ i ) {
		f[i] = cost[1][i]; //初始化为全用一条路
		for (int j = 1; j < i; ++ j ) {
			f[i] = min(f[i], f[j] + k + cost[j + 1][i]);
		}
	}
	
	cout << f[n];
	return 0;
}

标签:idx,int,Days,st,物流,cost,Luogu1772,ZJOI2006,dis
From: https://www.cnblogs.com/Raining-Hard/p/17376996.html

相关文章

  • 京东物流常态化压测实践
    作者:京东物流王江波一、常态化压测建设目的为什么做常态化压测?目前面临主要问题,性能问题滞后发现,给大促带来不可控风险。目前日常需求频繁迭代,系统配置的变更、上下游依赖的变化、服务器资源置换等诸多因素均会对系统性能产生一定影响;日常很难做到对所有新项目或需求上线前后......
  • 京东物流常态化压测实践
    作者:京东物流王江波一、常态化压测建设目的为什么做常态化压测?目前面临主要问题,性能问题滞后发现,给大促带来不可控风险。目前日常需求频繁迭代,系统配置的变更、上下游依赖的变化、服务器资源置换等诸多因素均会对系统性能产生一定影响;日常很难做到对所有新项目或需求上线前后都进......
  • P2596 [ZJOI2006]书架
    \(\color{purple}\text{P2596[ZJOI2006]书架}\)解题方法考虑使用\(\text{FHQ}\)平衡树,我们只使用编号,而不使用权值,平衡树上的先序遍历即为书的放置顺序。\(\text{Query}\):这是最简单的操作,直接查询即可。\(\text{Ask}\):本题的核心,我们知道编号,因为没有权值,没法从根往下......
  • SQL Server仓储物流公司visual studio发货数据仓库设计
    全文链接:http://tecdat.cn/?p=32241原文出处:拓端数据部落公众号分析师:YanlinLi仓储物流是货物生产销售的重要环节。随着贸易自由化和电子商务的兴起,物流企业快速发展,为提高仓库管理效率,发掘更多的仓库供应商客户,合理配置资源并降低经营成本,经营者在制定经营决策时需要分析仓储......
  • 线性规划——物流配送问题的R实现
    物流配送是电商物流的主要方式,基于电子商务的特点,对整个物流配送体系实行统一的信息管理和调度;按照用户订货要求,在物流中心进行理货工作,并将配好的货物送交收货人。物流仓储配送服务已然成为中国电子商务最为核心的作业环节,能够提供一个全面完善的物流仓储配送解决方案也成为了很......
  • 京东物流面单打印
    最近单位小商城上线,使用的京东物流,在订单和物流单的对接上效率有待提高,最后考虑我们自己打印“物流面单”,联系了当地工作人员,大概了解了对接流程:1、在京东物流开放平台上网上注册;2、创建应用时,选择“自研商家”,认证时要用到“月结编码或客户编号”,这个是重点; 3、使用应用的app......
  • 从申请到调用:全国快递物流查询 API 使用教程
    引言面对越来越多的快递需求和快递公司的日益增多,手动查询快递状态的工作变得愈发繁琐。此时,一个全国快递物流查询API的出现能够极大地提高查询的效率和准确性,解决人工查询的问题,为用户提供更加便捷的服务体验。全国快递物流查询API可以通过接口自动查询快递状态并返回相应信......
  • 中通快递查询单号,一键编辑关联信息,批量查询快递物流信息
    当你拥有多个快递单号的时候,如何通过单号查询物流,并编辑关联信息呢?今天小编给大家分享一个新的查询技巧,下面一起来试试。材料准备:一台Win系统的电脑安装一个快递批量查询高手快递单号若干步骤演示:步骤1:运行【快递批量查询高手】,首先,要添加单号,需要先单击左上角的“添加单号”步骤2:......
  • 快递单号查询自动查询,批量查快递,管理物流信息
    如何在电脑上快速查询多家快递单号的物流,并在查询快递一段时间后,删除不需要的单号呢?不知道如何操作的宝贝们,下面请随小编一起来试试吧。材料准备:一台Win系统的电脑安装一个快递批量查询高手快递单号若干步骤演示:步骤1:打开【快递批量查询高手】,主界面的上方是工具栏,下方是状态栏,整体......
  • 物流单号查询,批量查询快递单号,教你查看、搜索快递的最后站点
    最近有很多朋友在问,如何快速查询多家快递物流,像发出物流、最后站点能查到吗?小编的回答当然是可以的,下面一起用这个新的查询技巧来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?步骤1:打开【快递批量查询高手】,首先,要添加单号,需要先单击左上角的“添加单号......