题目: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. linux下eth0 lo wlan0

    参考:http://www.cnblogs.com/see7di/archive/2011/06/17/2239722.html 内容如下: 理解linux下的 eth0,eth1,eth2,lo 网 ...

  2. luogu P1149 火柴棒等式

    题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自 ...

  3. 存code

    #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> us ...

  4. Java网络编程之InetAddress和URL

    在Java中提供了专门的网络开发程序包---java.net,java的网络编程提供了两种通信协议:TCP(传输控制协议)和UDP(数据报协议). 一.IP(Internet Protocol) 与I ...

  5. how to avoid over-fitting?(机器学习中防止过拟合的方法,重要)

    methods to avoid overfitting: Cross-Validation : Cross Validation in its simplest form is a one roun ...

  6. UVa567_Risk(最短路)(小白书图论专题)

    解题报告 option=com_onlinejudge&Itemid=8&category=7&page=show_problem&problem=508"& ...

  7. 一个能自己主动搜索源文件并自己主动推导的Makefile

    今天看了一天的makefile的写法.东拼西凑.好不easy写出了一个makefile.颇有成就感,记录下来,以备温习之用. 如果有两个头文件文件夹 header1,header2;两个cpp文件文件 ...

  8. 机器学习技法总结(六)Decision Tree Hypothesis

    这里先再次提出我们利用aggregation获取更好性能的Hypothesis G所涉及的方法:blending,就是在得到g_set之后进行融合:learning呢?就是在线online的获取g并融 ...

  9. js 监控浏览器关闭(完美兼容chrome & ie & fire fox)

    var UnloadConfirm = {}; UnloadConfirm.MSG_UNLOAD = "数据尚未保存,离开后可能会导致数据丢失\n\n您确定要离开吗?"; Unlo ...

  10. ActiveMQ(一) 转

    package pfs.y2017.m11.mq.activemq.demo01; import javax.jms.Connection; import javax.jms.DeliveryMode ...