题目传送门(内部题83)


输入格式

  第一行两个整数$n,m$
  接下来$m$行,每行三个整数,$u,v,w$,表示从$u$到$v$有一条权值为$w$的边
  接下来一行有一个整数$q$,表示$q$天
  接下来$q$行,每行三个整数,$s_i,t_i,k_i$,表示从$s_i$到$t_i$至少经过$k_i$条边


输出格式

  一共$q$行,每行一个整数,表示在第$i$天中的最短距离,如果没有符合要求的答案,输出$-1$。


样例

样例输入:

3 3
1 2 1
2 3 10
3 1 100
3
1 1 1
1 2 1
1 3 1

样例输出:

111
1
11


数据范围与提示

  对于$30\%$的数据,$k_i\leqslant 50$
  对于另外$30\%$的数据,$q\leqslant 50$
  对于$100\%$的数据,$n\leqslant 50,m\leqslant 10,000,wi\leqslant 10,000,q\leqslant 100,000,ki\leqslant 10,000$


题解

$DP$和分块可能很难接合在一起,但是他们做到了。

不妨设$f[i][j][k]$表示从$i$到$j$恰好走$k$步的方案数,稍做修改就能做到至少走$k$步的方案数。

再设$p[i][j]$表示从$i$到$j$恰好走$100$步的方案数,这个数组也就是这道题的关键,将其分块了。

最后设$g[i][j][k]$表示从$i$到$j$恰好走$100\times k$的方案数即可。

最后答案就是$\min\limits_{i=1}^n(g[s][i][k/100]+f[i][t][k\%100])$。

时间复杂度:$\Theta(100\times n+q\times n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,m,q;
int d[51][51],p[51][51],g[51][51][200],f[51][51][200];
int main()
{
memset(d,0x3f,sizeof(d));
memset(g,0x3f,sizeof(g));
memset(f,0x3f,sizeof(f));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
d[u][v]=min(d[u][v],w);
}
for(int i=1;i<=n;i++)
{
f[i][i][0]=0;
for(int j=0;j<n+100;j++)
for(int k=1;k<=n;k++)
for(int l=1;l<=n;l++)
f[i][l][j+1]=min(f[i][l][j+1],f[i][k][j]+d[k][l]);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
p[i][j]=f[i][j][100];
for(int k=n+100;~k;k--)
f[i][j][k]=min(f[i][j][k],f[i][j][k+1]);
}
for(int i=1;i<=n;i++)
{
g[i][i][0]=0;
for(int j=0;j<100;j++)
for(int k=1;k<=n;k++)
for(int l=1;l<=n;l++)
g[i][l][j+1]=min(g[i][l][j+1],g[i][k][j]+p[k][l]);
}
scanf("%d",&q);
while(q--)
{
int s,t,k,ans=0x3f3f3f3f;
scanf("%d%d%d",&s,&t,&k);
for(int i=1;i<=n;i++)ans=min(ans,f[i][t][k%100]+g[s][i][k/100]);
if(ans==0x3f3f3f3f)puts("-1");
else printf("%d\n",ans);
}
return 0;
}

rp++

[CSP-S模拟测试]:旅行计划(分块+DP)的更多相关文章

  1. [CSP-S模拟测试]:Market(背包DP)

    题目描述 在比特镇一共有$n$家商店,编号依次为$1$到$n$.每家商店只会卖一种物品,其中第$i$家商店的物品单价为$c_i$,价值为$v_i$,且该商店开张的时间为$t_i$. $Byteasar ...

  2. [CSP-S模拟测试]:B(期望DP)

    题目传送门(内部题151) 输入格式 第一行一个整数$N$. 第二行$N$个整数,第$i$个为$a_i$. 输出格式 一行一个整数,表示答案.为避免精度误差,答案对$323232323$取模. 即设答 ...

  3. [CSP-S模拟测试]:密码(数位DP+库默尔定理)

    题目描述 为了揭穿$SERN$的阴谋,$Itaru$黑进了$SERN$的网络系统.然而,想要完全控制$SERN$,还需要知道管理员密码.$Itaru$从截获的信息中发现,$SERN$的管理员密码是两个 ...

  4. [CSP-S模拟测试]:硬币(博弈论+DP+拓展域并查集)

    题目传送门(内部题135) 输入格式 第一行包含一个整数$T$,表示数据组数. 对于每组数据,第一行两个整数$h,w$,表示棋盘大小. 接下来$h$行,每行一个长度为$w$的字符串,每个位置由为$o, ...

  5. [CSP-S模拟测试]:军训队列(DP+乱搞)

    题目描述 有$n$名学生参加军训,军训的一大重要内容就是走队列,而一个队列的不规整程度是该队中最高的学生的身高与最矮的学生的身高差值的平方.现在要将$n$名参加军训的学生重新分成$k$个队列,每个队列 ...

  6. [CSP-S模拟测试]:优化(贪心+DP)

    题目描述 $visit\text{_}world$发现有下优化问题可以用很平凡的技巧解决,所以他给你分享了这样一道题:现在有长度为$N$的整数序列$\{ a_i\}$,你需要从中选出$K$个不想叫的连 ...

  7. [CSP-S模拟测试]:玩具(概率DP)

    题目描述 这个故事发生在很久以前,在$IcePrincess\text{_}1968$和$IcePrince\text{_}1968$都还在上幼儿园的时候. $IcePrince\text{_}196 ...

  8. [CSP-S模拟测试]:超级树(DP)

    题目传送门(内部题5) 输入格式 一行两个整数$k$.$mod$,意义见上. 输出格式 一行一个整数,代表答案. 样例 样例输入1: 2 100 样例输出1: 样例输入2: 3 1000 样例输出2: ...

  9. [CSP-S模拟测试]:Park(树上DP)

    题目描述 公园里有$n$个雕像,有$n-1$条道路分别连接其中两个雕像,任意两个雕像可以直接或间接相连.现在每个景点$i$聚集着$P_i$只鸽子,旅行家手里有$v$数量的面包屑. 一旦旅行家在雕像$i ...

随机推荐

  1. 洛谷 P3857 彩灯 题解

    题面 对于每一个开关,我们可以看成一个0/1串,初始是一个全部为0的串,要求经过这些开关的操作后,出现的不同的0/1串的个数 建模就是存在一些数,这些数异或起来是0(等价于没有操作).那么需要求一个集 ...

  2. [UER #1] DZY Loves Graph

    题目描述 开始有 \(n\) 个点,现在对这 \(n\) 个点进行了 \(m\) 次操作,对于第 \(i\) 个操作(从 \(1\) 开始编号)有可能的三种情况: \(Add\) a b: 表示在 \ ...

  3. 利用lambda和条件表达式构造匿名递归函数

    from operator import sub, mul def make_anonymous_factorial(): """Return the value of ...

  4. jupyter notebook 使用多个python环境

    conda install nb_conda_kernels 执行上面的命令,然后启动notebook就可以选择conda中的所有环境了

  5. event.target和event.currentTarget的区别----0605加深理解

    target:触发事件的元素.currentTarget:事件绑定的元素.两者在没有冒泡的情况下,是一样的值,但在用了事件委托的情况下,就不一样了,例如: <ul id="ulT&qu ...

  6. 将ShellCode注入进程内存

    内存注入ShellCode的优势就在于被发现的概率极低,甚至可以被忽略,这是因为ShellCode被注入到进程内存中时,其并没有与之对应的硬盘文件,从而难以在磁盘中取证,但也存在一个弊端由于内存是易失 ...

  7. Spring Boot嵌入式的Servlet容器

    一.查看SpringBoot默认的嵌入式Servlet容器(默认使用的是tomcat) 在IDEA的项目的pom文件中按Ctrl + shift + Alt + U可以打开SpringBoot依赖的图 ...

  8. centos--软件源--本地软件源---离线安装

    一.软件源配置文件 1./etc/yum.conf 配置文件 [main] cachedir=/var/cache/yum #yum下载的RPM包的缓存目录 keepcache= #缓存是否保存,1保 ...

  9. window环境安装composer

    今天在下载symfony2的框架的时候,发现要用到composer,因为之前笔者完全没有接触过composer,所以研究了很久之后,才终于安装完成 由于网上有各种资料介绍如何安装composer的,但 ...

  10. caffe py3 docker

    https://hub.docker.com/r/mapler/caffe-py3/ docker pull mapler/caffe-py3 docker run  -it  mapler/caff ...