传送门

题目大意

给你一个n点m条边的有向图,q次询问,给定s,t,k,求由s到t至少经过k条边的最短路。

分析

我们设dp[i][j][k]为从i到j至少经过k条边的最短路,sp[i][j]意为从i到j只经过一条边的最短路,于是我们可以得到转移方程式:dp[i][k]=Min{dp[i][m][k-1]+sp[m][j]}。但是我们发现这个样复杂度并不行,于是我们考虑分块,定每一个块的大小为100,对于小于等于100的所有k我们使用上面的dp式子暴力预处理,在这之后我们将按以上方式求出的k=100时的值作为新的sp来更新所有为100的倍数的情况,注意由于题目要求是至少经过k条边而不是正好经过k条边,所以这个地方我们需要使用两点间最短距离更新一下之前求出的数组(具体实现见代码)。在有了这些预处理之后我们将给定的k分块,使得q=k/100,r=k%100,所以我们只需枚举一个v使得s到v经过r条边的最短路+v到t经过100q条边的最短路最小即可。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
const int inf = 0x3f3f3f3f;
int n,m,g[][],d[][],f[][],a[][][],b[][][],use[][];
inline void mul(int a[][],int b[][],int c[][]){
int i,j,k;
memset(use,0x3f,sizeof(use));
for(i=;i<=n;i++)
for(j=;j<=n;j++)
for(k=;k<=n;k++)
use[i][j]=min(use[i][j],a[i][k]+b[k][j]);
for(i=;i<=n;i++)
for(j=;j<=n;j++)
c[i][j]=use[i][j];
}
int main(){
int i,j,k,t;
scanf("%d",&t);
while(t--){
memset(g,0x3f,sizeof(g));
scanf("%d%d",&n,&m);
for(i=;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
g[x][y]=min(g[x][y],z);
}
for(i=;i<=n;i++)
for(j=;j<=n;j++)
a[][i][j]=b[][i][j]=(i==j?:inf);
for(i=;i<=;i++)
mul(a[i-],g,a[i]);
for(i=;i<=;i++)
mul(b[i-],a[],b[i]);
for(i=;i<=n;i++)
for(j=;j<=n;j++)
d[i][j]=(i==j?:g[i][j]);
for(k=;k<=n;k++)
for(i=;i<=n;i++)
for(j=;j<=n;j++)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
for(int _=;_<=;_++){
memset(f,0x3f,sizeof(f));
for(i=;i<=n;i++)
for(j=;j<=n;j++)
for(k=;k<=n;k++)
f[i][j]=min(f[i][j],b[_][i][k]+d[k][j]);
for(i=;i<=n;i++)
for(j=;j<=n;j++)
b[_][i][j]=f[i][j];
}
int q;
scanf("%d",&q);
for(i=;i<=q;i++){
int s,t,K;
scanf("%d%d%d",&s,&t,&K);
int s1=K%,s2=K/;
int ans=inf;
for(j=;j<=n;j++)
ans=min(ans,a[s1][s][j]+b[s2][j][t]);
if(ans<inf)printf("%d\n",ans);
else puts("-1");
}
}
return ;
}

最新文章

  1. 掌握 Cinder 的设计思想 - 每天5分钟玩转 OpenStack(46)
  2. 我离baidu.com有几跳
  3. Salesforce 执行顺序
  4. python网络编程【二】(使用TCP)
  5. [转]7个高性能JavaScript代码高亮插件
  6. HDU 1532 最大流模板题
  7. strcpy vs memcpy
  8. pydev导入eclipse
  9. UnityShader快速上手指南(二)
  10. Sublime text 3 格式化HTML/css/js/json代码 插件
  11. Linux学习笔记之权限与命令之间的关系(重要)及文件与文件夹知识总结
  12. 好看的复选框(Checkbox)效果
  13. /usr/bin/python^M: 解释器错误: 没有那个文件或目录
  14. zabbix监控mysql性能
  15. 缓存ABC
  16. intellij idea工具 DeBug调试
  17. 定义静态map
  18. python数学第七天【期望的性质】
  19. Python数据分析与挖掘常用模块
  20. css定位“十字架“之水平垂直居中

热门文章

  1. Python网络编程2018-01-26更新
  2. 2018年 7月总结&amp;8月计划
  3. MySQL相关日志介绍
  4. C# Message 消息处理
  5. java常用的空对象 null
  6. Jetty + Servlet 实现文件下载
  7. ORACLE显式授权
  8. Python:内置split()方法
  9. AngularJS:实例
  10. 怎样在win7中 安装Tomcat7.0