「ZJOI2006」物流运输
题目
【题目描述】
【输入格式】
【输出格式】
【样例】
样例输入
5 5 10 8
1 2 1
1 3 3
1 4 2
2 3 2
2 4 4
3 4 1
3 5 2
4 5 2
4
2 2 3
3 1 1
3 3 3
4 4 5
样例输出
32
【样例解释】
题解
【做题经理】
首先,这道题涉及最短路是肯定看得出来。
但是呢,到底该怎么处理有些路不能走的情况呢?
这个时候,我想到了最短路和次短路,用类似树 $dp$ 的办法对其进行处理。
但是这样想有个 $bug$ ,那就是万一最短路和次短路都走不通的情况呢?
然后我就开始疯狂幻想次次短路、次次次短路......
【正解】
我在考虑这道题的时候,忽略了这道题的数据范围:$n(1\le n\le 100),m(1\le m\le 20)$
可以看出 $n$ 和 $m$ 都是很小的,那么我们为什么不直接暴力做呢。
但是这个暴力也是基于 $dp$ 的基础上的。
首先可以设一个简单的状态:
$dp[i]$:到第 $i$ 天所用的最小花费
那么状转呼之而出
$dp[i]=dp[j]+cost[j+1][i]*(i-j)+K$
其中, $j$ 是我们改变航道的那天。此状转的意思就是从第 $j$ 天开始更换新的航道,由第 $j+1$ 天到第 $i$ 天用同一个航道,前 $j$ 天怎么走的不管,因为这是前面处理的事情,对于我们现阶段不影响。
那么现在只剩一个问题:$cost[i][j]$ 怎么求呢?
从定义入手:
$cost[i][j]$:从第 $i$ 天到第 $j$ 天用同一条航道的最小花费。
再回到前面所说的,此题数据范围很小,那么我们可以直接暴力处理出 $cost[i][j]$
那么代码也就出来了
#include<bits/stdc++.h>
using namespace std;
#define int long long
template<class T>inline void qread(T& x){
char c;bool f=false;x=0;
while((c=getchar())<'0'||'9'<c)if(c=='-')f=true;
for(x=(c^48);'0'<=(c=getchar())&&c<='9';x=(x<<1)+(x<<3)+(c^48));
if(f)x=-x;
}
template<class T,class... Args>inline void qread(T& x,Args&... args){qread(x),qread(args...);}
inline int rqread(){
char c;bool f=false;int x=0;
while((c=getchar())<'0'||'9'<c)if(c=='-')f=true;
for(x=(c^48);'0'<=(c=getchar())&&c<='9';x=(x<<1)+(x<<3)+(c^48));
return f?-x:x;
}
template<class T>inline T Max(const T x,const T y){return x>y?x:y;}
template<class T>inline T Min(const T x,const T y){return x<y?x:y;}
template<class T>inline T fab(const T x){return x>0?x:-x;}
const int MAXN=100;
const int MAXM=20;
class gragh{
#define EDGE_SIZE 400
#define NODE_SIZE 20
#define INF 0x3f3f3f3f
public:
int N,M;
struct edge{int to,nxt,w;
edge(){}
edge(const int T,const int Nx,const int W):to(T),nxt(Nx),w(W){}
}e[EDGE_SIZE+5];
int tail[NODE_SIZE+5],ind;
inline void add_edge(const int u,const int to,const int w){e[++ind]=edge(to,tail[u],w);tail[u]=ind;}
inline void dijkstra(int dis[],const int s,bool vis[]){
struct node{int u,w;
node(){}
node(const int U,const int W):u(U),w(W){}
bool operator<(const node a)const{return !(w<a.w);}
};
for(int i=1;i<=N;++i)dis[i]=INF;
priority_queue<node>Q;
Q.push(node(s,dis[s]=0));
while(!Q.empty()){
int u=Q.top().u;Q.pop();
for(int i=tail[u],v;i;i=e[i].nxt)if(dis[v=e[i].to]>dis[u]+e[i].w&&!vis[v])
Q.push(node(v,(dis[v]=dis[u]+e[i].w)));
}
}
inline bool spfa(int dis[],const int s,bool vis[]){
int cnt[NODE_SIZE+5];/*bool vis[EDGE_SIZE+5];*/
queue<int>Q;
for(int i=1;i<=N;++i)dis[i]=INF/*,vis[i]=false*/,cnt[i]=0;
Q.push(s);
dis[s]=0,cnt[s]=1;
while(!Q.empty()){
int now=Q.front();Q.pop();
vis[now]=false,++cnt[now];
if(cnt[now]>N)return false;
for(int i=tail[now],v;i;i=e[i].nxt){
v=e[i].to;
if(dis[now]+e[i].w<dis[v]){
dis[v]=dis[now]+e[i].w;
if(!vis[v])Q.push(v),vis[v]=true;
}
}
}
return true;
}
inline void clr(){memset(tail,ind=0,sizeof tail);}
gragh(){clr();}
#undef EDGE_SIZE
#undef NODE_SIZE
#undef INF
}G;
int n,K,d,cost[MAXN+5][MAXN+5];
bool inf[MAXM+5][MAXN+5];
inline void init(){
qread(n,G.N,K,G.M);
for(int i=1,a,b,c;i<=G.M;++i){
qread(a,b,c);
G.add_edge(a,b,c);
G.add_edge(b,a,c);
}
qread(d);
for(int i=1,P,a,b;i<=d;++i){
qread(P,a,b);
for(int j=a;j<=b;++j)inf[P][j]=true;
}
}
void calcCost(){
bool vis[MAXM+5];int dis[MAXM+5];
for(int i=1;i<=n;++i)for(int j=i;j<=n;++j){
memset(vis,0,sizeof vis);
for(int k=1;k<=G.N;++k)for(int t=i;t<=j;++t)
if(inf[k][t]){vis[k]=true;break;}
G.spfa(dis,1,vis);
cost[i][j]=dis[G.N];
}
}
inline void getDp(){
int dp[MAXN+5];
for(int i=1;i<=n;++i)dp[i]=0x3f3f3f3f;
for(int i=1;i<=n;++i){
dp[i]=cost[1][i]*i;
for(int j=i-1;j>=0;--j)
dp[i]=Min(dp[i],dp[j]+cost[j+1][i]*(i-j)+K);
}
printf("%lld\n",dp[n]);
}
signed main(){
init();
calcCost();
getDp();
return 0;
}
「ZJOI2006」物流运输的更多相关文章
- 「bzoj1003」「ZJOI2006」物流运输 最短路+区间dp
「bzoj1003」「ZJOI2006」物流运输---------------------------------------------------------------------------- ...
- 【BZOJ1003】【ZJOI2006】物流运输
1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2556 Solved: 1008[Submit] ...
- 【BZOJ】【1003】【ZJOI2006】物流运输trans
最短路/DP 这题数据规模并不大!!这是重点……… 所以直接暴力DP就好了:f[i]表示前 i 天的最小花费,则有$f[i]=min\{f[j]+cost[j+1][i]+k\} (0\leq j \ ...
- BZOJ_1003_[ZJOI2006]_物流运输_(动态规划+最短路)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1003 m个码头,从1运货到m,n天每天运,其中有一些码头在特定的天里不能使用.运货的代价:在两 ...
- 「NOIP2013」「LuoguP1967」货车运输(最大生成树 倍增 LCA
题目描述 AA国有nn座城市,编号从 11到nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最 ...
- 物流运输trans「ZJOI2006」
[题目描述] 物流公司要把一批货物从码头\(A\)运到码头\(B\).由于货物量比较大,需要\(n\)天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运 ...
- 「luogu2680」[NOIp2015] 运输计划
题目大意:给定一棵n个节点的树,输入m组一条链的两个端点:把树上的某个边权改为0,求m条链长度的最大值的最小值: 一.考虑二分: 1.对于需要判断是否为可行方案的 mid,所有链长不大于 mid 的链 ...
- 「NOIP2013」货车运输
传送门 Luogu 解题思路 首先 \(\text{Kruskal}\) 一下,构造出一棵森林. 并查集还要用来判断连通性. 倍增 \(\text{LCA}\) 的时候顺便维护一下路径最小值即可. 细 ...
- [ZJOI2006]物流运输
1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5999 Solved: 2473[Submit][Stat ...
随机推荐
- PTA喊山
喊山 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的.原来它是彝族 ...
- Educational Codeforces Round 77 (Rated for Div. 2)D(二分+贪心)
这题二分下界是0,所以二分写法和以往略有不同,注意考虑所有区间,并且不要死循环... #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> ...
- onblur事件和onfocus事件失效
先看onblur事件和onfocus事件的定义: <element onblur="SomeJavaScriptCode"> <element onfocus=& ...
- python练习:斐波那契数列的递归实现
python练习:斐波那契数列的递归实现 重难点:递归的是实现 def fib(n): if n==0 or n==1: return 1 else: return fib(n-1)+fib(n-2) ...
- ASP.NET Core搭建多层网站架构【9.1-使用Autofac代替原生的依赖注入】
2020/01/30, ASP.NET Core 3.1, VS2019, Autofac.Extensions.DependencyInjection 5.0.1 摘要:基于ASP.NET Core ...
- eight(待考究)
为什么明明结果都可以到达那种情况,步骤不一样就不给通过 QAQ 有哪位大佬提点一下,在下感激不尽~~~ 我的代码: #include <iostream>#include <queu ...
- 操作COOKIE的函数
一个同学慧涛分享给我的他写的操作cookie的函数,贴出来,做个笔记: //操作cookie //删除cookie hcookie('cookiename','','del'); //查询cookie ...
- 绕过QQ群文件下载限速
绕过QQ群文件下载限速 引言 众所周知,用QQ客户端下载QQ群文件,速度往往被限为10KB/s.这里我们来讲讲如何绕过这一限制. 原始事件发生在2020年2月2日,值武汉疫情爆发,全国各省市纷纷下令推 ...
- selenium 元素查找与属性
1.首先你要安装selenium库啦 pip install selenium 2.selenium查找元素就八种方法 from selenium import webdriver driver=we ...
- web.xml中的welcome-file-list标签作用
welcome-file-list是一个配置在web.xml中的一个欢迎页,用于当用户在url中输入项目名称或者输入web容器url(如http://localhost:8080/)时直接跳转的页面. ...