这道题是相当的火,但是在tyher的讲解下我一遍就AC了!!!

Part 1 理解题目

从第一天到最后一天,总会有一些点莫名其妙地走不了,所以导致我们不能按照上一次的最短路一直运输得到最少费用,而需要不停地更换航线来保证可以运到终点,答案就是在这些方案中选出运输费用最少的。

Part 2 思想过程

首先会想到我们每天都跑一遍SPFA,找最短路,如果和上一天不一样,那就改航线,加一下K的贪心方法。这样显然是错误的伪得不能再伪的贪心,而且要把最短路一个一个抠出来,不说T,写都写死你!

然后我们发现,这道题每天无非就两种决策,一种换航线,一种不换航线。那么,就可以想到dp(至于怎么想到的……题解帮我想的)我们设dp[i]表示前i天航行送完所有的货物所需要的最小花费。转移:dp[i]=min(dp[i],dp[j]+K+w[j+1][i]);这里的j是枚举的i之前的第几天,w[i][j]是从i天到j天航线都可以走的最短路,K是换航线的费用。既然出现了“最短路”这种东西,那就SPFA吧,把这期间不能走的点标记一下,跑一遍裸的SPFA,再记入数组,算一个王者预处理吧……哈哈哈……

Part 3 代码实现

dp过程

 for(rg int i=;i<=day;++i)
{
dp[i]=w[][i];
for(rg int j=;j<i;++j)
{
p[i]=min(dp[i],dp[j]+K+w[j+][i]);
}
}

SPFA之前的处理码头

读入损坏码头

 for(rg int i=;i<=d;++i)
{
rg int p=read(),a=read(),b=read();
for(rg int j=a;j<=b;++j)
  bre[j][++bre[j][]]=p;
}

标记损坏码头(每一次枚举到的时间区间都要做)

memset(b,,sizeof(b));
for(rg int k=i;k<=j;++k)
{
for(rg int l=;l<=bre[k][];l++)
{
b[bre[k][l]]=;
}
}

SPFA模板

inline void SPFA()
{
memset(vis,,sizeof(vis));
memset(team,,sizeof(team));
for(rg int i=;i<=n;++i)dis[i]=;
rg int top=,tail=;
team[]=;vis[]=;dis[]=;
while(top<tail)
{
top++;
rg int now=team[top];vis[now]=;
for(rg int i=head[now];i;i=ljl[i].nxt)
{
rg int qw=ljl[i].to;
if(dis[qw]>dis[now]+ljl[i].v&&!b[qw])
{
dis[qw]=dis[now]+ljl[i].v;
if(!vis[qw])
{
team[++tail]=qw;
vis[qw]=;
}
}
}
}
}

完整代码!!!

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<ctime>
#include<queue>
#define rg register
#define lst long long
#define N 150
#define M 1200
using namespace std; int day,n,K,m,d,cnt;
struct edge{
int to,v,nxt;
}ljl[M<<];
int head[N],team[N],dis[N],dp[N];
int w[N][N],bre[N][N];
bool vis[N],b[N]; inline int read()
{
rg int s=,m=;rg char ch=getchar();
while(ch!='-'&&(ch<''||ch>''))ch=getchar();
if(ch=='-')m=-,ch=getchar();
while(ch>=''&&ch<='')s=(s<<)+(s<<)+ch-'',ch=getchar();
return s*m;
} inline void add(rg int p,rg int q,rg int o)
{
ljl[++cnt].to=q;
ljl[cnt].v=o;
ljl[cnt].nxt=head[p];
head[p]=cnt;
} inline void SPFA()
{
memset(vis,,sizeof(vis));
memset(team,,sizeof(team));
for(rg int i=;i<=n;++i)dis[i]=;
rg int top=,tail=;
team[]=;vis[]=;dis[]=;
while(top<tail)
{
top++;
rg int now=team[top];vis[now]=;
for(rg int i=head[now];i;i=ljl[i].nxt)
{
rg int qw=ljl[i].to;
if(dis[qw]>dis[now]+ljl[i].v&&!b[qw])
{
dis[qw]=dis[now]+ljl[i].v;
if(!vis[qw])
{
team[++tail]=qw;
vis[qw]=;
}
}
}
}
} int main()
{
day=read(),n=read(),K=read(),m=read();
for(rg int i=;i<=m;++i)
{
rg int p=read(),q=read(),o=read();
add(p,q,o),add(q,p,o);
}
d=read();
for(rg int i=;i<=d;++i)
{
rg int p=read(),a=read(),b=read();
for(rg int j=a;j<=b;++j)
bre[j][++bre[j][]]=p;
}
for(rg int i=;i<=day;++i)
{
for(rg int j=i;j<=day;++j)
{
memset(b,,sizeof(b));
for(rg int k=i;k<=j;++k)
{
for(rg int l=;l<=bre[k][];l++)
{
b[bre[k][l]]=;
}
}
SPFA();
if(dis[n]!=)w[i][j]=(j-i+)*dis[n];
else w[i][j]=dis[n];
}
}
for(rg int i=;i<=day;++i)
{
dp[i]=w[][i];
for(rg int j=;j<i;++j)
{
dp[i]=min(dp[i],dp[j]+K+w[j+][i]);
}
}
cout<<dp[day]<<endl;
return ;
}

物流运输(最短路+dp)的更多相关文章

  1. BZOJ1003 物流运输 最短路+DP

    1003: [ZJOI2006]物流运输 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条 ...

  2. bzoj1003物流运输 最短路+DP

    bzoj1003物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输 ...

  3. P1772 [ZJOI2006]物流运输 最短路+DP

    思路:最短路+DP 提交:1次 题解: $f[i]$表示到第$i$天的最小代价,我们可以预先处理出$i,j$两天之间(包括$i,j$)都可通行的最短路的代价记做$s[i][j]$,然后有$f[i]=m ...

  4. BZOJ 1003 - 物流运输 - [最短路+dp]

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1003 Time Limit: 10 Sec Memory Limit: 162 MB D ...

  5. [bzoj1003][ZJOI2006][物流运输] (最短路+dp)

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  6. 1003: [ZJOI2006]物流运输 最短路+dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=1003 数据范围很小,怎么瞎搞都行,n方dp,然后跑出最短路暴力转移,需要注意的是不能使用的可能有多 ...

  7. 「bzoj1003」「ZJOI2006」物流运输 最短路+区间dp

    「bzoj1003」「ZJOI2006」物流运输---------------------------------------------------------------------------- ...

  8. BZOJ-1003 物流运输trans SPFA+DP

    傻逼错误耗我1h,没给全范围坑我1A.... 1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MB Submit: 529 ...

  9. BZOJ 1003 物流运输trans dijstra+dp

    1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3896  Solved: 1608[Submit] ...

随机推荐

  1. 脚本_获取本机 MAC 地址

    #!bin/bash#作者:liusingbon#功能:获取本机 MAC 地址ip a s |awk 'BEGIN{print "本机 MAC 地址信息如下:"}/^[0-9]/{ ...

  2. OSI参考模型与TCP/IP参考模型与TCP/IP协议栈

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11484126.html OSI参考模型与TCP/IP参考模型与TCP/IP协议栈 TCP/IP分层模型 ...

  3. 第五周作业—N42-虚怀若谷

    一.查找/etc目录下大于1M且类型为普通文件的所有文件 [root@centos7 ~]# find /etc -type f -size +1M -exec ls -lh {} \; -r--r- ...

  4. netty模型简介

    Netty工作原理图 netty抽象出了两组线程池,BossGroup专门负责客户端 的连接,WorkerGroup专门负责网络读写. BossGroup和WorkerGroup 类型都是NioEve ...

  5. Flink 实战:如何解决生产环境中的技术难题?

    大数据作为未来技术的基石已成为国家基础性战略资源,挖掘数据无穷潜力,将算力推至极致是整个社会面临的挑战与难题. Apache Flink 作为业界公认为最好的流计算引擎,不仅仅局限于做流处理,而是一套 ...

  6. swift中为什么要创造出可选型?

    (1)因为nil这个东西,swift中没有就是没有.  Int? 叫 整型可选型,如果不提前声明,直接赋值变量 nil会报错 . 可以将Int赋值给Int?   ,但是不能将Int?赋值给Int . ...

  7. Oracle分组函数之Grouping Sets

    功能介绍: 自定义分组的字段 创建表: 插入测试数据: Grouping Sets(null,t.classid,(t.classid,t.studentname)),类似于ROLLUP Select ...

  8. 【HDOJ6625】three arrays(Trie树,贪心)

    题意:给定两个长均为n的序列a和b,要求两两配对,a[i]和b[j]配对的值为a[i]^b[j],求字典序最小的配对后的值序列 n<=1e5,a[i],b[i]<2^30 思路: 做法一: ...

  9. (转)Python3 zip() 函数

    转:http://www.runoob.com/python3/python3-func-zip.html 描述 zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返 ...

  10. 三层for循环求解组成三角形边的组合

    假设a.b.c是三角形的三条边,当三条边符合勾股定理时,即,a2+b2=c2 ,为直角三角形.若a.b.c均为小于等于50的整数,求能够组成直角三角形的所有组合.请显示边的各种可能组合情况,显示总的组 ...