题目大意:

给定单向图的n m 为点数和单向边数

接下来m行给定 u v w 为边的起点终点和长度

给定q 为询问个数

接下来q行给定 x y k 求从x到y至少经过k条边的最短路长度

https://blog.csdn.net/qkoqhh/article/details/81301910

设 d[ i ][ j ][ k ] 为从i到j走至少k条边的最短路长度

设 f[ i ][ j ][ k ] 为从i到j恰好走k*100条边的最短路长度

那么至少走K条边的话

若 K>=100 有 f[ i ][ j ][ K/100 ] + d[ i ][ j ][ K%100 ]

若 K%100==0 有 f[ i ][ j ][ K/100 ]

若 K<100 有 d[ i ][ j ][ K ]

最小值就是至少走K条边的最短路

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int N=+;
const int M=1e4+;
int n, m;
int d[N][N][], f[N][N][];
int main()
{
int _; scanf("%d",&_);
while(_--) {
scanf("%d%d",&n,&m);
inc(i,,n)inc(j,,n) d[i][j][]=INF;
while(m--) {
int u,v,w; scanf("%d%d%d",&u,&v,&w);
d[u][v][]=min(d[u][v][],w); // 更新至少1条边的答案
}
inc(i,,n)inc(j,,n) d[i][j][]=d[i][j][];
// 至少0条边的答案应和至少1条相同
inc(i,,n) d[i][i][]=;
// 点到本身的距离至少0条边答案肯定为0
inc(k,,) {
inc(i,,n)inc(j,,n) d[i][j][k]=INF;
inc(p,,n)inc(i,,n)inc(j,,n) // Floyd
d[i][j][k]=min(d[i][j][k],d[i][p][k-]+d[p][j][]);
}
inc(i,,n)inc(j,,n) f[i][j][]=d[i][j][];
// 按100条边(求了150条)分块应该够了
inc(k,,) {
inc(i,,n)inc(j,,n) f[i][j][k]=INF;
inc(p,,n)inc(i,,n)inc(j,,n) // Floyd
f[i][j][k]=min(f[i][j][k],f[i][p][k-]+f[p][j][]);
}
dec(k,,)
inc(i,,n)inc(j,,n)
d[i][j][k]=min(d[i][j][k],d[i][j][k+]);
// 至少k条边的答案 如果k+1的答案更优 同样可以更新
int q; scanf("%d",&q);
while(q--) {
int u,v,k; scanf("%d%d%d",&u,&v,&k);
int ans=INF;
if(k>) {
inc(p,,n)
ans=min(ans,f[u][p][k/]+d[p][v][k%]);
}
if(k%==) ans=min(ans,f[u][v][k/]);
if(k<=) ans=min(ans,d[u][v][k]);
if(ans==INF) printf("-1\n");
else printf("%d\n",ans);
}
} return ;
}

最新文章

  1. C#对.zip 存档读取和写入
  2. 与你相遇好幸运,制作自己的Yeoman Generator
  3. java中instanceof和getClass()的区别分析
  4. 【书海】《Head First Java》 ——读后总结
  5. 使用Div+CSS布局设计网站的优点
  6. Javascript手记-垃圾收集
  7. MySQL open table
  8. Oracle监听静态注册和动态注册
  9. eclipse-jee 配置tomcat7,解决404错误
  10. VUGEN错误处理函数--lr-continue-on-error
  11. Java Web项目(Extjs)报错五
  12. c++11の顺序容器
  13. java学习(一)
  14. Linux中对逻辑卷进行扩容与缩小
  15. 2. Spring Boot项目启动原理初探
  16. 源码管理工具Git-客户端GitBash常用命令
  17. Linux 小知识翻译 - 「Linux的吉祥物企鹅叫什么名字?」
  18. element——message消息提示
  19. HDU 4027 Can you answer these queries? (线段树区间修改查询)
  20. Android数据适配-ExpandableListView

热门文章

  1. python学习笔记:操作数据库
  2. Apache的虚拟主机功能(基于IP、域名、端口号)
  3. Django 模型层关系映射
  4. shell编程:find命令
  5. redis 入门之列表
  6. Codesforces 485D Maximum Value
  7. Python之元组、列表and 字典
  8. 深信服杯ctf部分wp
  9. VS2013+Opencv3.3配置教程
  10. 负载均衡实现故障vip自动漂移