题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1003

DP好题;

直接找一个时间段的最短路,并用它来预处理出每个时间段的最小花费;

f[i]代表一条路走到时间的花费,所以转移要加上K。

枚举所有路线的TLE代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,K,e,head[],ct,D,d[],rt[],pr[],f[][],cnt,ans;
bool vis[];
struct N{
int to,next,w;
N(int t=,int n=,int w=):to(t),next(n),w(w) {}
}edge[];
void dfs(int x,int r,int p)
{
if(x==m)
{
rt[++cnt]=(r|(<<(m-)));
pr[cnt]=p;
return;
}
vis[x]=;
for(int i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if(vis[v])continue;
dfs(v,(r|(<<(v-))),p+edge[i].w);
}
vis[x]=;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&K,&e);
for(int i=,x,y,z;i<=e;i++)
{
scanf("%d%d%d",&x,&y,&z);
edge[++ct]=N(y,head[x],z);head[x]=ct;
edge[++ct]=N(x,head[y],z);head[y]=ct;
}
scanf("%d",&D);
for(int i=,p,a,b;i<=D;i++)
{
scanf("%d%d%d",&p,&a,&b);
for(int j=a;j<=b;j++)d[j]|=(<<(p-));//第j天不能通过的码头
}
dfs(,,);
memset(f,0x3f,sizeof f);
for(int j=;j<=cnt;j++)f[][j]=;
for(int i=;i<=n;i++)
for(int j=;j<=cnt;j++)
{
if(rt[j]&d[i])continue;
for(int k=;k<=cnt;k++)
f[i][j]=min(f[i][j],f[i-][k]+(j==k?pr[j]:K+pr[j]));
}
ans=0x3f;
for(int j=;j<=cnt;j++)ans=min(ans,f[n][j]);
printf("%d",ans);
return ;
}

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
queue<int>q;
int const inf=0x3f3f3f3f;
int n,m,K,e,head[],ct,mr[][],D,zt[],dis[],f[];
bool vis[],d[][];
struct N{
int to,next,w;
N(int t=,int n=,int w=):to(t),next(n),w(w) {}
}edge[];
void spfa()
{
memset(vis,,sizeof vis);
memset(dis,0x3f,sizeof dis);
while(q.size())q.pop();
dis[]=;q.push();vis[]=;
while(q.size())
{
int x=q.front();q.pop();vis[x]=;
for(int i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if(dis[v]>dis[x]+edge[i].w&&!zt[v])
{
dis[v]=dis[x]+edge[i].w;
if(!vis[v])vis[v]=,q.push(v);
}
}
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&K,&e);
for(int i=,x,y,z;i<=e;i++)
{
scanf("%d%d%d",&x,&y,&z);
edge[++ct]=N(y,head[x],z);head[x]=ct;
edge[++ct]=N(x,head[y],z);head[y]=ct;
}
scanf("%d",&D);
for(int i=,p,a,b;i<=D;i++)
{
scanf("%d%d%d",&p,&a,&b);
for(int j=a;j<=b;j++)d[p][j]=;
}
for(int i=;i<=n;i++)
{
memset(zt,,sizeof zt);
for(int j=i;j<=n;j++)
{
for(int k=;k<=m;k++)zt[k]|=d[k][j];
spfa();
mr[i][j]=dis[m];//在下面乘 小心爆int
}
}
for (int i=;i<=n;i++)
for (int j=i;j<=n;j++)
if (mr[i][j]<inf)mr[i][j]*=(j-i+);
for(int i=;i<=n;i++)f[i]=mr[][i];
for(int i=;i<=n;i++)
{
for(int j=;j<i;j++)
f[i]=min(f[i],f[j]+mr[j+][i]+K);
}
printf("%d",f[n]);
return ;
}

bzoj1003物流运输——DP的更多相关文章

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

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

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

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

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

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

  4. BZOJ 1003 物流运输 (dp + dijkstra)

    1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8672  Solved: 3678[Submit][Stat ...

  5. bzoj1003 物流运输

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

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

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

  7. 1003: [ZJOI2006]物流运输 = DP+SBFA

    题意就是告诉你有n个点,e条边,m天,每天都会从起点到终点走一次最短路,但是有些点在某些时间段是不可走的,因此在某些天需要改变路径,每次改变路径的成本是K,总成本=n天运输路线长度之和+K*改变运输路 ...

  8. BZOJ.1003.[ZJOI2006]物流运输(DP 最短路Dijkstra)

    题目链接 容易看出是个最短路+DP.既然答案和天数有关,那么就令\(f[i]\)表示前\(i\)天最小成本. 这个转移很好想: \(f[i]=\min(f[i],\ f[j]+cost(j+1,i)+ ...

  9. BZoj 1003 物流运输 DP+最短路

    2013-09-11 09:56 W[I]代表前I天能取得的最小花费,假设在第J天更改一次路线,那么如果有 W[I]>W[J]+第j+1到第I天的最小花费+更改路线的花费(K) 那么更新W[I] ...

随机推荐

  1. vue之条件渲染

    一.v-if v-if指令用于条件的渲染一块内容,当指令的表达式返回true时,内容才会被渲染. <h1 v-if="isshow">要显示么</h1> d ...

  2. 字符串哈希hash

    题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转 ...

  3. 当传入数据只有一个时mybatis中<if>判断会出现There is no getter for property named 'subjectId' in 'class java.lang.Intege

    用"_parameter"代替当前参数 正确: <select id="selectSubjectByPId" parameterType="j ...

  4. Dfs学习经验(纸上运行理解DFS)【两道题】

    首先我想吐槽的是,在CSDN上搞了好久还是不能发博客,就是点下发表丝毫反应都没有的,我稍微百度了几次还是没有找到解决方法,在CSDN的BBS上也求助过管理员但是没有收到答复真是烦躁,导致我新生入学以来 ...

  5. 使用Maven运行Java main的方法(转)

    使用Maven运行Java Main的方法(既Java Application项目),可以有如下方式解决: 1.将Maven项目导入到eclipse中,然后直接项目右键[Run As]->[Ja ...

  6. Object中的wait,notify,notifyAll基本使用(转)

    让线程停止运行/睡眠的方法只有两个:Thread.sleep()或者obj.wait() 记住obj.nofity()并不能停止线程运行,因为notify虽然释放了锁,但依然会急促执行完synchro ...

  7. android 播放MP3

    <?xml version="1.0" encoding="utf-8"?> <!-- 定义当前布局的基本LinearLayout --> ...

  8. 【转载】云计算的三种服务模式:IaaS,PaaS和SaaS

    一张图就看懂了.其他的都不用说了. 原文:http://blog.csdn.net/hjxgood/article/details/18363789

  9. Intent传递简单对象与集合

    我们在Intent传递传递对象.能够有三种方式,实现Serializable接口.实现Parcelable接口,使用json格式序列化与反序列化. 在此我们使用第二方式,现实Parcelable接口, ...

  10. 关于从 coding 拉项目的操作

    介绍:coding是托管代码的仓库   sourceTree 是把代码提交到coding的界面化工具 1.通过百度 登录coding账号