bzoj 1003物流运输 区间dp+spfa
基本思路:
一开始确实没什么思路,因为觉得怎么着都会超时,然后看一下数据范围,呵,怎么都不会超时。
思路:
1.看到能改变线路,想到可以用以下区间dp,区间dp的话,先枚举长度,枚举开始位置,然后枚举中间点 dp[i][j]=min(dp[i][j],dp[i][z]+dp[z][j]+k);
2.然后每段时间最短路究竟是多少,然后因为不会超时,所以就二重循环枚举就好了
(ps:这里要说明一下给自己提个醒:
spfa就是队列优化的迪杰斯特拉,然后的话vis数组每次出一个就置零一个,如果不置零是错的
堆优化的迪杰斯特拉自己之前也加vis,而且每次出一个的话不置零,不会错,因为vis数组是不必要的
所以以后写的话一般就写spfa好了,堆优化的迪杰斯特拉的话略难写一点,而且两者速度也差不多
普通的迪杰斯特拉的话还是要置零的,因为比起spfa就是优化在了队列
)
代码如下:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<string>
#include<algorithm>
#include<queue> using namespace std; typedef long long ll; const int inf = 0x3f3f3f3f;
const int maxn = 100+10; int head[maxn],cnt;
struct Edge{
int to,val,next;
}edge[maxn<<4];
ll tim[maxn][maxn],f[maxn][maxn];
bool flag[maxn][maxn],block[maxn],vis[maxn];
int dis[maxn];
int n,m,k; void add(int u,int v,int w){
edge[cnt].to=v;
edge[cnt].val=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
int spfa(int s,int e){
memset(block,false,sizeof(block));
memset(vis,false,sizeof(vis));
memset(dis,inf,sizeof(dis));
queue<int>q;
q.push(1);vis[1]=true;dis[1]=0;
for(int i=s;i<=e;i++){
for(int j=1;j<=m;j++){
if(flag[i][j]){
block[j]=true;
}
}
}
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].to;
int w=edge[i].val;
if(!block[v]&&dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(!vis[v]){
vis[v]=true;
q.push(v);
}
}
}
vis[u]=false;
}
return dis[m];
}
void dp(){
for(int l=1;l<=n;l++){
for(int s=1;s<=n;s++){
int e=s+l-1;
if(e>n) continue;
f[s][e]=(ll)tim[s][e]*(e-s+1);
for(int z=s;z<e;z++){
f[s][e]=min(f[s][e],f[s][z]+k+f[z+1][e]);
}
}
}
}
int main(){
memset(head,-1,sizeof(head));cnt=0;
int p;
scanf("%d%d%d%d",&n,&m,&k,&p);
for(int i=1;i<=p;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);add(v,u,w);
}
int q;
scanf("%d",&q);
for(int i=1;i<=q;i++){
int id,u,v;
scanf("%d%d%d",&id,&u,&v);
for(int j=u;j<=v;j++){
flag[j][id]=true;
}
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
tim[i][j]=spfa(i,j);
}
}
dp();
cout<<f[1][n]<<endl;
return 0;
}
bzoj 1003物流运输 区间dp+spfa的更多相关文章
- BZOJ 1003 物流运输 题解 【SPFA+DP】
BZOJ 1003 物流运输 题解 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的 ...
- BZOJ 1003 物流运输 (动态规划 SPFA 最短路)
1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 5590 Solved: 2293 [Submit][Stat ...
- BZOJ 1003 物流运输 (dp + dijkstra)
1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 8672 Solved: 3678[Submit][Stat ...
- BZOJ 1003 物流运输trans dijstra+dp
1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3896 Solved: 1608[Submit] ...
- BZOJ 1003 物流运输trans
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...
- bzoj1003: [ZJOI2006]物流运输(DP+spfa)
1003: [ZJOI2006]物流运输 题目:传送门 题解: 可以用spfa处理出第i天到第j都走这条路的花费,记录为cost f[i]表示前i天的最小花费:f[i]=min(f[i],f[j-1] ...
- BZOJ 1003 - 物流运输 - [最短路+dp]
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1003 Time Limit: 10 Sec Memory Limit: 162 MB D ...
- BZoj 1003 物流运输 DP+最短路
2013-09-11 09:56 W[I]代表前I天能取得的最小花费,假设在第J天更改一次路线,那么如果有 W[I]>W[J]+第j+1到第I天的最小花费+更改路线的花费(K) 那么更新W[I] ...
- [BZOJ]1003 物流运输(ZJOI2006)
挖坑,日常划水. 从BZOJ上的AC人数来看这题确实不难,但做这种题的常见思路让小C决定还是mark一下. Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才 ...
随机推荐
- [USACO17JAN]Balanced Photo平衡的照片 (树状数组)
题目链接 Solution 先离散化,然后开一个大小为 \(100000\) 的树状数组记录前面出现过的数. 然后查询 \((h[i],n]\) 即可. 还要前后各做一遍. Code #include ...
- 170820-关于JSP页面的知识点
1.JSP [1] 简介 > HTML - HTML擅长显示一个静态的网页,但是不能调用Java程序. > Servlet - Servlet擅长调用Java程序和后台进行交互,但是它不擅 ...
- laravel5.6操作数据curd写法(查询构建器)
laravel5.6 数据库操作-查询构建器 <?php //laravel5.6 语法 demo示例 namespace App\Http\Controllers;//命名该控制App空间下名 ...
- Windows 环境下vue+webpack前端开发环境搭建
一.开发环境搭建 1.前端框架一般依赖node.js,我们首先要安装node.js. 2.由于许多npm 的源都在国外的地址,安装起来特别慢,所以我们这里利用淘宝的镜像服务器. 安装命令为:npm i ...
- fread fwrite文本模式读写回车换行符 自动转换问题
fread 会把\r\n(0d0a)替换为\nfwrite 会把\n替换为\r\n(0d0a),\r\n会变成\r\r\n(0d0d0a) 今天在写一个日志类,用于打印服务程序的信息. 我将每一个日 ...
- iOS 创建.xcworkspace文件
首先创建一个HelloWorld工程,步骤如下:iOS开发环境搭建 及 编写1个hello world 然后: 1. 终端run $ cd到.xcodeproj同级文件夹 2. 终端run $ pod ...
- 测开之路八十五:python处理csv文件
写入csv文件 一:写入字典 二:写入普通数据 读取: 第一种:普通读取 第二种:读取csv并用namedtuple映射列名,类似于使用类的实例 第三种:字典形式 import csvfrom col ...
- PHP安装-centos7
下载地址:https://www.php.net/downloads.php 1.wget下载php源码至/usr/local/src 下 wget https://www.php.net/distr ...
- Bootstrap 学习笔记12 轮播插件
轮播插件: <!-- data-ride="carousel"自动播放 --> <div id="myCarousel" class=&quo ...
- 【python】随机数相关
http://www.cnblogs.com/yd1227/archive/2011/03/18/1988015.html 该博文写的很详细,备忘. 需要注意的是,写测试脚本的时候,不要将脚本命名成跟 ...