这是一道数据范围和评测时间水的可怕的题,只是思路有点难想,BUT假如你的思路清晰,完全了解怎么该做,那就算你写一个反LLL和反SLE都能A,如此水的一道题,你不心动吗?

  下面贴出题目

Description

  物流公司要把一批货物从码头A运到码头B。由于货物量比较大,需要n天才能运完。货物运输过程中一般要转
停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种
因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。但是
修改路线是一件十分麻烦的事情,会带来额外的成本。因此物流公司希望能够订一个n天的运输计划,使得总成本
尽可能地小。

Input

  第一行是四个整数n(1<=n<=100)、m(1<=m<=20)、K和e。n表示货物运输所需天数,m表示码头总数,K表示
每次修改运输路线所需成本。接下来e行每行是一条航线描述,包括了三个整数,依次表示航线连接的两个码头编
号以及航线长度(>0)。其中码头A编号为1,码头B编号为m。单位长度的运输费用为1。航线是双向的。再接下来
一行是一个整数d,后面的d行每行是三个整数P( 1 < P < m)、a、b(1< = a < = b < = n)。表示编号为P的码
头从第a天到第b天无法装卸货物(含头尾)。同一个码头有可能在多个时间段内不可用。但任何时间都存在至少一
条从码头A到码头B的运输路线。

Output

  包括了一个整数表示最小的总成本。总成本=n天运输路线长度之和+K*改变运输路线的次数。

Sample Input

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

Sample Output

32
//前三天走1-4-5,后两天走1-3-5,这样总成本为(2+2)*3+(3+2)*2+10=32
 
这道题的思路有些难想,核心思想是DP+SPFA
那么如何处理SPFA+DP捏
首先,我们要做一个大暴力,那就是枚举算cost[i][j],表示第i天到第j天走同一路径的解,注意这个解在算出路径长度之后要乘以天数。
这不会超时吗?????
鉴于这道题极其水的数据范围和数据,回答是:不会
那么接下来,我们把i从1枚举到n,i表示天数递增,求f[i],同时枚举断点j,转移方程为f[i]=min(f[i],f[j]+cost[j+1][i]+k),(k为改变路径所需代价,注意,这里的i和j是表示天数改变,不是路径,所以不会和SPFA冲突,直接使用算出来的解就好),然后我们就会机智的发现每次改变路线一定会花费k作为代价,但即使不更改只是新建路径也会有k为代价,所以最后答案要减去  把某路径作为初始路径时加上的k,然后就讲完辣
(表示还是我第一次刷DP+图论的如此结合。。。)
下面给出没有优化的代码
 #include<stdio.h>
#include<string.h>
int min(int x,int y){return x>y?y:x;}
struct shit{
int aim;
int lon;
int next;
}e[];
int n,m,K,E,F[],quq[],d[],star,ass,point,head[],a,b,c,cost[][];
bool f[],s[],mp[][];
void fuck(int x,int y,int z)
{
e[++point].aim=y;
e[point].lon=z;
e[point].next=head[x];
head[x]=point;
e[++point].aim=x;
e[point].lon=z;
e[point].next=head[y];
head[y]=point;
}
void SPFA()
{
memset(f,false,sizeof(f));
memset(d,0x3f3f3f3f,sizeof(d));
star=;
ass=;
quq[star]=;
f[]=true;
d[]=;
while(star<=ass)
{
int u=quq[star++];
for(int k=head[u];k;k=e[k].next)
{
int v=e[k].aim;
if(s[v])continue;
if(d[v]>d[u]+e[k].lon)
{
d[v]=d[u]+e[k].lon;
if(f[v])continue;
f[v]=true;
quq[++ass]=v;
}
}
f[u]=false;
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&K,&E);
for(int i=;i<=E;i++)
{
scanf("%d%d%d",&a,&b,&c);
fuck(a,b,c);
}
int D;
scanf("%d",&D);
for(int i=;i<=D;i++)
{
scanf("%d%d%d",&a,&b,&c);
for(int j=b;j<=c;j++)
mp[a][j]=true;
}
for(int i=;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
memset(s,false,sizeof(s));
for(int k=;k<m;k++)for(int q=i;q<=j;q++)if(mp[k][q]){s[k]=true;break;}//这里是因为算的是在i到j天走同一路径所用的时间,所以直接对不可操作路径堵死就好
SPFA();
cost[i][j]=d[m]*(d[m]>=0x3f3f3f3f?:j-i+);//这里如果你对于不可达的也直接乘了天数就会爆int
}
}
memset(F,0x3f3f3f3f,sizeof(F));
F[]=;
for(int i=;i<=n;i++)
{
for(int j=;j<i;j++)
F[i]=min(F[i],F[j]+cost[j+][i]+K);
}
printf("%d",F[n]-K);
return ;
} 没有优化orz

然而优化过的代码我还没有写,,,

 

值得一做》关于一道DP+SPFA的题 BZOJ1003 (BZOJ第一页计划) (normal-)的更多相关文章

  1. 值得一做》关于并查集的进化题目 BZOJ1015(BZOJ第一页计划)(normal-)

    这道题和以前做过的一道经典的洪水冲桥问题很像,主要做法是逆向思维.(BZOJ第10道非SB题纪念) 先给出题目 Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者 ...

  2. 值得一做》关于数学与递推 BZOJ1002 (BZOJ第一页计划)(normal+)

    什么都不说先甩题目 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之 ...

  3. 值得一做》一道类似于货车运输的题目(BZOJ3732)(easy+)

    这是一道模板套模板的题目,只要会LCA和最小生成树就可以做,水题 直接先甩题目 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条 ...

  4. 刷题向》DP》值得一做》关于对DP问题的充分考虑(normal)

    在你辛苦调试一道DP题,遇到瓶颈的时候,你是否感到一股洪荒之力遏制住你的思想,使你给题库贡献了一倍的WA.RE.TLE量,却没有AC过一次? 在这时,你应该考虑的是砸电脑再次重新考虑整个题目,再应对自 ...

  5. POJ 3182 The Grove [DP(spfa) 射线法]

    题意: 给一个地图,给定起点和一块连续图形,走一圈围住这个图形求最小步数 本来是要做课件上一道$CF$题,先做一个简化版 只要保证图形有一个点在走出的多边形内就可以了 $hzc:$动态化静态的思想,假 ...

  6. 值得一做》关于双标记线段树两三事BZOJ 1798 (NORMAL-)

    这是一道双标记线段树的题,很让人很好的预习/学习/复习线段树,我不知道它能让别人学习什么,反正让我对线段树的了解更加深刻. 题目没什么好讲的,程序也没什么好讲的,所以也没有什么题解,但是值得一做 给出 ...

  7. 63. Unique Paths II(中等, 能独立做出来的DP类第二个题^^)

    Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...

  8. BZOJ1003物流運輸 DP + SPFA

    @[DP, SPFA] Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要\(n\)天才能运完.货物运输过程中一般要转 停好几个码头.物流公司通常会设计一条固定的运 ...

  9. HDU 4085 Peach Blossom Spring 斯坦纳树 状态压缩DP+SPFA

    状态压缩dp+spfa解斯坦纳树 枚举子树的形态 dp[i][j] = min(dp[i][j], dp[i][k]+dp[i][l]) 当中k和l是对j的一个划分 依照边进行松弛 dp[i][j]  ...

随机推荐

  1. 对结合BDD进行DDD开发的一点思考和整理

    引言 二十年前的我,还在学校里抱着一台DIY机(德州486+大众主板+16M内存+3.5inch软驱+昆腾320M硬盘,当时全校最快主机没有之一),揣着一本<Undocumented DOS&g ...

  2. (一)java概述

    1.Java1995年斯坦福大学网络公司推出的一门高级语言.一种面向网络,完全的面向对象,完全可靠跨平台的语言.      java:一种面向对象的高级语言           将现实生活中的事物以及 ...

  3. Net Core网络通信

    Net Core网络通信 https://www.cnblogs.com/xxred/p/9859893.html 聊聊如何设计千万级吞吐量的.Net Core网络通信! 作者:大石头 时间:2018 ...

  4. 《Troubleshooting SQL Server》读书笔记-内存管理

    自调整的数据库引擎(Self-tuning Database Engine) 长期以来,微软都致力于自调整(Self-Tuning)的SQL Server数据库引擎,用以降低产品的总拥有成本.从SQL ...

  5. Android Studio 打包及引用 AAR(可能是史上最详细的 )

    https://www.jianshu.com/p/1777a634db5e Android Library(AAR) 的好处 Android 库在结构上与 Android 应用模块相同.它可以提供构 ...

  6. Java Integer和String内存存储

    标签: java内存string 2016-01-10 12:51 1545人阅读 评论(2) 收藏 举报  分类: Java(7)  版权声明:本文为博主原创文章,未经博主允许不得转载. 先看代码: ...

  7. css中伪类和伪元素的区别

    转载:http://www.cnblogs.com/ihardcoder/p/5294927.html CSS3伪类和伪元素的特性和区别   前端er们大都或多或少地接触过CSS伪类和伪元素,比如最常 ...

  8. 项目中使用的图片上传方法,base64存本地

    //生成健康报告 public function uploadJkbg(Request $r) { $data = $r->all(); $jkbg['jkbg_ctime'] = time() ...

  9. heartbeat测试

    节点名: node-master 192.168.1.77 node-slave 192.168.1.88 VIP 192.168.1.234 带下划线的不允许作为节点名 修改节点名字 gvim /e ...

  10. Spring 循环依赖

    循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA,则它们最终反映为一个环.此处不 ...