hdu6331 /// Floyd+分块DP
题目大意:
给定单向图的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 ;
}
hdu6331 /// Floyd+分块DP的更多相关文章
- Codeforces Round #278 (Div. 1) D - Conveyor Belts 分块+dp
D - Conveyor Belts 思路:分块dp, 对于修改将对应的块再dp一次. #include<bits/stdc++.h> #define LL long long #defi ...
- ACM: HDU 5418 Victor and World - Floyd算法+dp状态压缩
HDU 5418 Victor and World Time Limit:2000MS Memory Limit:131072KB 64bit IO Format:%I64d & ...
- AOJ 2200 Mr. Rito Post Office(Floyd+单调DP)
[题目链接] http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2200 [题目大意] 一张图中有陆路和水路,水路必须要有船才能走,当船 ...
- CF1129D Isolation(分块+DP)
一个很显然的DP方程式:f[i]=Σf[j],其中j<i且在[j+1,i]中出现1次的数不超过k个 乍一看挺神仙的,只会O(n^2),就是对于每个位置从后向前扫一遍,边扫边统计出现1次的数的个数 ...
- LOJ #2802. 「CCC 2018」平衡树(整除分块 + dp)
题面 LOJ #2802. 「CCC 2018」平衡树 题面有点难看...请认真阅读理解题意. 转化后就是,给你一个数 \(N\) ,每次选择一个 \(k \in [2, N]\) 将 \(N\) 变 ...
- [NOIP2016 D1T3]换教室 【floyd+概率dp】
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤ ...
- POJ3311Hie with the Pie(floyd传递+DP,状态压缩)
问题 The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unfo ...
- [CSP-S模拟测试]:旅行计划(分块+DP)
题目传送门(内部题83) 输入格式 第一行两个整数$n,m$ 接下来$m$行,每行三个整数,$u,v,w$,表示从$u$到$v$有一条权值为$w$的边 接下来一行有一个整数$q$,表示$q$天 接下来 ...
- bzoj4720 / P1850 换教室(Floyd+期望dp)
P1850 换教室 先用Floyd把最短路处理一遍,接下来就是重头戏了 用 f [ i ][ j ][ 0/1 ] 表示在第 i 个时间段,发出了 j 次申请(注意不一定成功),并且在这个时间段是否( ...
随机推荐
- springboot核心原理
1.基于你对springboot的理解描述一下什么是springboot 它是一个服务于spring框架的框架,能够简化配置文件,快速构建web应用, 内置tomcat,无需打包部署,直接运行. 2. ...
- ACM_ICPC_Team
题目: There are a number of people who will be attending ACM-ICPC World Finals. Each of them may be we ...
- jumpserver3.0安装
由于来源身份不明.越权操作.密码泄露.数据被窃.违规操作等因素都可能会使运营的业务系统面临严重威胁,一旦发生事故,如果不能快速定位事故原因,运维人员往往就会背黑锅.几种常见的运维人员背黑锅场景:1)由 ...
- 2018-2-13-win10-uwp-魔力鬼畜
title author date CreateTime categories win10 uwp 魔力鬼畜 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17: ...
- JS window对象 返回浏览历史中的其他页面 go()方法,根据当前所处的页面,加载 history 列表中的某个具体的页面。 语法: window.history.go(number);
返回浏览历史中的其他页面 go()方法,根据当前所处的页面,加载 history 列表中的某个具体的页面. 语法: window.history.go(number); 参数: 浏览器中,返回当前页面 ...
- Nodejs去掉/favicon.ico的请求
const http=require("http"); const server=http.createServer(); server.on("request" ...
- Java常见的开源数据连接池有哪些,并对参数做出简单的说明
(1)DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序中使用,Tomcat的数据源使用的就是DBCP. (2)c3p0 c3p ...
- elasticsearch启动问题
ES安装完一直启动不了,问题解决. 报错: ERROR: bootstrap checks failed system call filters failed to install; check th ...
- redis - 环境搭建(转)
一:简介(来自百科) redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zse ...
- python补充4
一 如何判断一个对象是不是函数类型 #方法一def func(arg): if callable(arg): print("是函数"+arg()) else: print(arg) ...