bzoj1003物流运输——DP
题目: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的更多相关文章
- bzoj1003物流运输 最短路+DP
bzoj1003物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输 ...
- BZOJ1003 物流运输 最短路+DP
1003: [ZJOI2006]物流运输 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条 ...
- BZOJ-1003 物流运输trans SPFA+DP
傻逼错误耗我1h,没给全范围坑我1A.... 1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MB Submit: 529 ...
- BZOJ 1003 物流运输 (dp + dijkstra)
1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 8672 Solved: 3678[Submit][Stat ...
- bzoj1003 物流运输
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...
- P1772 [ZJOI2006]物流运输[DP+最短路]
题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪. ...
- 1003: [ZJOI2006]物流运输 = DP+SBFA
题意就是告诉你有n个点,e条边,m天,每天都会从起点到终点走一次最短路,但是有些点在某些时间段是不可走的,因此在某些天需要改变路径,每次改变路径的成本是K,总成本=n天运输路线长度之和+K*改变运输路 ...
- BZOJ.1003.[ZJOI2006]物流运输(DP 最短路Dijkstra)
题目链接 容易看出是个最短路+DP.既然答案和天数有关,那么就令\(f[i]\)表示前\(i\)天最小成本. 这个转移很好想: \(f[i]=\min(f[i],\ f[j]+cost(j+1,i)+ ...
- BZoj 1003 物流运输 DP+最短路
2013-09-11 09:56 W[I]代表前I天能取得的最小花费,假设在第J天更改一次路线,那么如果有 W[I]>W[J]+第j+1到第I天的最小花费+更改路线的花费(K) 那么更新W[I] ...
随机推荐
- 数据库设计三范式(3NF)
问:当时你数据库是如何设计的? 答:当时是按照三范式规范设计的: 第一范式: 1:数据库的原子性,即保证数据库表的每一列都不可分割的 第二范式: 1:原子性,即保证数据库表的每一列都不可分割 2:表中 ...
- 让win7任务条上的文件夹打开是c,d,e,f而不是库
如果资源管理器是打开的,则右键点击资源管理器的图标,在跳出的菜单中,右键点击“Windows资源管理器”,选择“属性”. 在“快捷方式’选项卡,“目标”一栏,默认的是 %windir%\explore ...
- 论DATASNAP结合FIREDAC的使用方法
论DATASNAP结合FIREDAC的使用方法 自DELPHI XE5开始引入FIREDAC数据引擎以来,FIREDAC就正式成为了官方的数据引擎.一直到XE10.1 UPDATE1,据笔者观察,FI ...
- NHibernate之旅(7):初探NHibernate中的并发控制
本节内容 什么是并发控制? 悲观并发控制(Pessimistic Concurrency) 乐观并发控制(Optimistic Concurrency) NHibernate支持乐观并发控制 实例分析 ...
- 【转载】C#扫盲之:静态成员、静态方法、静态类、实例成员及区别
文章目录 1.静态成员.实例成员 2.静态类 3.类的静态成员和非静态成员区别 --------------------------------------分割线------------------- ...
- Seesion和Cookie详解2
转载来自: https://www.toutiao.com/a6693986851193094664/?tt_from=weixin&utm_campaign=client_share& ...
- ajax的异步操作及页面重定向跳转
今天主要分享一个简单的ajax的异步操作数据,用javascript也有一段时间了,刚开始看到一些页面在没有页面刷新的情况下就可以实现数据的保存或者获取,觉得挺不可思议的,感觉速度很快,做了几个项目之 ...
- Apache Qpid Broker云
一. 什么是Broker云 Apathe Qpid 支持Broker Federation ,也就是Broker联盟或者叫做Broker云.Broker Federation可以通过配置消息路 ...
- Hadoop之HDFS文件操作
摘要:Hadoop之HDFS文件操作常有两种方式.命令行方式和JavaAPI方式.本文介绍怎样利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件 命令行 Java API HD ...
- LeetCode(67)题解: Add Binary
https://leetcode.com/problems/add-binary/ 题目: Given two binary strings, return their sum (also a bin ...