这是一道数据范围和评测时间水的可怕的题,只是思路有点难想,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. Android 进阶7:进程通信之 AIDL 的使用

    读完本文你将了解: AIDL 是什么 AIDL 支持的数据类型 AIDL 如何编写 AIDL 实例 创建 AIDL 编写服务端代码 编写客户端代码 运行结果 总结 代码地址 Thanks 记得 201 ...

  2. what is out of band mode.

    Most of the steps are the same, except instead of sending an URL as the oauth_callback to request_to ...

  3. Ubuntu 中 java 环境 (sunjdk) 的配置 (附详细说明)

    暑假以来为了鼓捣双系统废了很大的劲儿,本来一股脑想装 CentOS,无奈怎么处理分区引导都不能成功地与 Win8 共存,最终用 Ubuntu 一句 "检测到系统上有 Windows Boot ...

  4. php str_pad();

    <?php $str = "Hello World"; echo str_pad($str,30,"."); ?> 运行实例 定义和用法 str_p ...

  5. 【PS实例】轻松打造梦幻的照片

    本系列教程将开始讲解PS的一些制作实例,通过实例的讲解同时介绍各种工具和面板机快捷键的使用,这样能够让大家更有兴趣学习,在学习的同时能够创造出自己喜欢的东西.本人使用的教程都是根据本人多次调试制作,仅 ...

  6. 【java规则引擎】java规则引擎搭建开发环境

    Drools官网:http://www.jboss.org/drools Drools and jBPM consist out of several projects:(Drools软件包提供的几个 ...

  7. LG2120 [ZJOI2007]仓库建设

    题意 L公司有N个工厂,由高到底分布在一座山上. 工厂1在山顶,工厂N在山脚. 由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用. 突然有一天,L公司的总裁L先生接到 ...

  8. 洛谷 P3225 [HNOI2012]矿场搭建

    传送门 题目大意:建设几个出口,使得图上无论哪个点被破坏,都可以与出口联通. 题解:tarjian求割点 首先出口不能建在割点上,找出割点,图就被分成了几个联通块. 每个联通块,建出口.如果割点数为0 ...

  9. devops 几个方便的工具

    1. fake API      [canned](https://github.com/sideshowcoder/canned  )    fake API.      [wiremock](ht ...

  10. 缓存(Cache)管理 ---- 系列文章

    利用Cache防止同一帐号重复登录 .net中Cache管理操作 系统缓存全解析 (下) 系统缓存全解析 (中) 系统缓存全解析 (上) 出处:http://www.cnblogs.com/luckd ...