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] ...
随机推荐
- Hadoop HDFS 常用命名
HDFS命令基本格式:hadoop fs -cmd < args > ls 命令hadoop fs -ls / 列出hdfs文件系统根目录下的目录和文件 hadoop fs -ls -R ...
- ZJGSU-ACM OJ 心得
一个我觉得蛮重要的问题,也是会经常碰到的问题 就是觉得自己对的代码提交到OJ发现输出超限 我是真的输出超限了吗? QAQ 其实,不然. 我把这类问题分为几类: (一):死循环:while(1) 比如以 ...
- 【kotlin】kotlin中List中添加List怎么操作
如题,List集合添加一个List集合怎么操作 如上,现在有了List<A>,A类中有个字段List<B>, 新创建一个List<B>,想把LIst<A> ...
- codeforces 553 A Kyoya and Colored Balls
这个题.比赛的时候一直在往dp的方向想,可是总有一个组合数学的部分没办法求, 纯粹组合数学撸,也想不到办法-- 事实上,非常显然.. 从后往前推,把第k种颜色放在最后一个,剩下的k球.还有C(剩余的位 ...
- 小程序 - tabBar
Tips:如果网页图片(文字)看不清,请按CTRL+鼠标滚轮 1.建议使用阿里图库 或者 easyicon 2.建议使用81*81且低于40KB的图片(建议jpg) 3.如需查看脑图结构,请点击:ta ...
- python xmlrpc
rpc 协议 RPC = Remote Procedure Call Protocol,即远程过程调用协议. xml rpc 协议 使用http协议作为传输协议,使用xml文本传输命令和数据的一种协议 ...
- 互斥锁和条件变量(pthread)相关函数
互斥锁 #include <pthread.h> // 若成功返回0,出错返回正的Exxx值 // mptr通常被初始化为PTHREAD_MUTEX_INITIALIZER int pth ...
- android经常使用正则工具类
此类提供日常开发中经常使用的正则验证函数.比方:邮箱.手机号.电话号码.身份证号码.日期.数字.小数.URL.IP地址等.使用Pattern对象的matches方法进行整个字符匹配,调用该方法相当于: ...
- SQL面试练习(MySql)
创建测试数据库: /*如果已经存在此数据库,先删除*/ drop database if exists sqltest ; /*创建并设置编码为UTF-8*/ create database sqlt ...
- 用python编写的定向arp欺骗工具
刚学习了scapy模块的一些用法,非常强大,为了练手,利用此模块编写了一个arp欺骗工具,其核心是构造arp欺骗包.加了一个-a参数用于进行全网欺骗,先暂不实现.代码如下: #--*--coding= ...