hdu6331 Problem M. Walking Plan
题目大意
给你一个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 ;
}
hdu6331 Problem M. Walking Plan的更多相关文章
- HDU6331 Problem M. Walking Plan【Floyd + 矩阵 + 分块】
HDU6331 Problem M. Walking Plan 题意: 给出一张有\(N\)个点的有向图,有\(q\)次询问,每次询问从\(s\)到\(t\)且最少走\(k\)条边的最短路径是多少 \ ...
- 2018 杭电多校3 - M.Walking Plan
题目链接 Problem Description There are $$$n$$$ intersections in Bytetown, connected with $$$m$$$ one way ...
- 2018HDU多校训练-3-Problem M. Walking Plan
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6331 Walking Plan Problem Description There are n inte ...
- HDU6331Problem M. Walking Plan
传送门 分块floyd $f[i][j][k]$表示从i走k步到j的最短路 $g[i][j][k]$表示从i走k*100步到j的最短路 $h[i][j][k]$表示从i至少走k步到j的最短路 询问从x ...
- 2018多校第三场 hdu6331 M :Walking Plan
题目链接 hdu6331 自我吐槽,这场多校大失败,开局签到因输入输出格式写错,wa了3发.队友C题wa了1个小时,还硬说自己写的没错,结果我随便造了个小数据,他都没跑对.然后跑对了后又进入了无限的卡 ...
- 【做题】HDU6331 Walking Plan——矩阵&分块
题意:给出一个有\(n\)个结点的有向图,边有边权.有\(q\)组询问,每次给出\(s,t,k\),问从\(s\)到\(t\)至少经过\(k\)条边的最短路. \(n \leq 50, \, q \l ...
- hdu6331 Walking Plan
题意: sol: 考虑floyed 直接暴力做的话复杂度是kn^3会炸. 考虑一个比较神仙的分块做法. 注意到我们是可以直接求单独某个k的矩阵,使用矩阵快速幂即可(取min的矩阵乘法). 单独求一次的 ...
- 2018 Multi-University Training Contest 3 Solution
A - Problem A. Ascending Rating 题意:给出n个数,给出区间长度m.对于每个区间,初始值的max为0,cnt为0.遇到一个a[i] > ans, 更新ans并且cn ...
- hdu多校第三场
Problem D. Euler Function 思路:打表找找规律. #include<bits/stdc++.h> #define LL long long #define fi f ...
随机推荐
- hdoj-1027-Ignatius and the Princess II(逆康拓展开)
题目链接 /* Name: Copyright: Author: Date: 2018/5/2 11:07:16 Description:输出第m小的序列 */ #include <iostre ...
- codeforces 755F F. PolandBall and Gifts(贪心+多重背包)
题目链接: F. PolandBall and Gifts time limit per test 1.5 seconds memory limit per test 256 megabytes in ...
- Spring通过注解方式实现定时任务
XML配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:/ ...
- LintCode Sliding Window Matrix Maximum
原题链接在这里:http://www.lintcode.com/zh-cn/problem/sliding-window-matrix-maximum/ 题目: Given an array of n ...
- 月薪3万Java程序员要达到的技术层次
要达到月薪3万,一般要在北上广深杭知名的互联网公司,同时要在某一个知识领域达到专家级别,而不是简单的掌握SSH那么简单.虽然对部分人有点难,但目标还是要有的,万一实现呢? 首先三万的月薪在BAT实在太 ...
- Excel合并计算
office版本为2013,数据来源:我要自学网,曾贤志老师 计算之前,光标定在空白位置,不要定在数据源. 将汇总的类型居于首列(不可以跨区域选择,可以把不需要汇总的移动到其他列). 要有删除原来数据 ...
- BZOJ3745:[COCI2015]Norma
浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...
- zabbix3.2.1安装graphtrees插件
https://blog.csdn.net/liang_baikai/article/details/53542317 graphtree介绍 由于zabbix的图像显示一块不太友好,图像没法集中显示 ...
- ASP.NET网站性能提升的几个方法
1. HTTP 压缩 HTTP 压缩通常用于压缩从服务端返回的页面内容.它压缩HTTP请求和响应,这个会是巨大的性能提升.我的项目是基于Window Server 2003开发的,可以参考这篇文章. ...
- cassandra安装配置
准备运行环境1.1 cassandra可以安装在windows和linux下,本例子安装在centos6.7的环境下.1.2 关闭防火墙.或者开放9042(默认的CQL本地服务端口).9160(默认的 ...