Codeforces 576D Flights for Regular Customers(矩阵加速DP)
题目链接 Flights for Regular Customers
首先按照$d$的大小升序排序
然后分成$m$个时刻,每条路径一次处理过来。
$can[i][j]$表示当前时刻$i$能否走到$j$
$can$通过上一条路径后的$can$和当前的可行路径矩阵的$d$次幂得到。
这由$floyd$求解即可。考虑到$d$很大,用矩阵快速幂加速。
TLE on test 10
矩阵乘法的时候用$bitset$优化。
更新答案的时候,我们枚举每个点。
若第$1$个点可以走到第$i$个点,则更新答案。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 160;
const int inf = 0x3f3f3f3f; int n, m, ans = inf;
int dis[N][N], f[N][N];
int cnt;
bitset <N> can[N], now[N], tmp[N], base[N]; struct node{
int x, y, d;
void scan(){ scanf("%d%d%d", &x, &y, &d); }
friend bool operator < (const node &a, const node &b){
return a.d < b.d;
}
} e[N]; void Mul(bitset<N> *a, bitset<N> *b){
bitset<N> ret[N];
rep(i, 1, n) rep(j, 1, n) if(a[i][j]) ret[i] |= b[j];
rep(i, 1, n) a[i] = ret[i];
} void Pow(bitset <N> *a, int b){
bitset <N> ret[N];
rep(i, 1, n) ret[i][i] = 1;
for (; b; b >>= 1){
if (b & 1) Mul(ret, a);
Mul(a, a);
}
rep(i, 1, n) a[i] = ret[i];
} int main(){ scanf("%d%d", &n, &m);
rep(i, 1, m) e[i].scan(); sort(e + 1, e + m + 1); rep(i, 1, n) rep(j, 1, n) dis[i][j] = inf;
rep(i, 1, n) dis[i][i] = 0; cnt = 0;
ans = inf;
rep(i, 1, n) can[i][i] = 1; rep(i, 1, m){
int x = e[i].x, y = e[i].y, d = e[i].d;
rep(j, 1, n) tmp[j] = base[j];
Pow(tmp, d - cnt);
Mul(can, tmp);
rep(j, 1, n) rep(k, 1, n) dis[j][k] = min(dis[j][k], dis[j][x] + 1 + dis[y][k]);
rep(j, 1, n - 1) if (can[1][j]) ans = min(ans, d + dis[j][n]);
cnt = d;
base[x][y] = 1;
} if (ans < 0x3f3f3f3f) printf("%d\n", ans);
else puts("Impossible");
return 0;
}
Codeforces 576D Flights for Regular Customers(矩阵加速DP)的更多相关文章
- Codeforces 576D Flights for Regular Customers 矩阵快速幂+DP
题意: 给一个$n$点$m$边的连通图 每个边有一个权值$d$ 当且仅当当前走过的步数$\ge d$时 才可以走这条边 问从节点$1$到节点$n$的最短路 好神的一道题 直接写做法喽 首先我们对边按$ ...
- Codeforces 576D Flights for Regular Customers (图论、矩阵乘法、Bitset)
题目链接 http://codeforces.com/contest/576/problem/D 题解 把边按\(t_i\)从小到大排序后枚举\(i\), 求出按前\((i-1)\)条边走\(t_i\ ...
- Codeforces 576D - Flights for Regular Customers(bitset 优化广义矩阵乘法)
题面传送门 题意: 有一张 \(n\) 个点 \(m\) 条边的有向图,你初始在 \(1\) 号点,边上有边权 \(c_i\) 表示只有当你经过至少 \(c_i\) 条边的时候你才能经过第 \(i\) ...
- Codeforces 576D. Flights for Regular Customers(倍增floyd+bitset)
这破题调了我一天...错了一大堆细节T T 首先显然可以将边权先排序,然后逐个加进图中. 加进图后,倍增跑跑看能不能到达n,不能的话加新的边继续跑. 倍增的时候要预处理出h[i]表示转移矩阵的2^0~ ...
- CF576D Flights for Regular Customers 矩阵乘法 + Bitset优化
%%%cxhscst2's blog Codeforces 576D Flights for Regular Customers(矩阵加速DP) 代码非常优美 + 简洁,学习到了 Code: #inc ...
- (中等) CF 576D Flights for Regular Customers (#319 Div1 D题),矩阵快速幂。
In the country there are exactly n cities numbered with positive integers from 1 to n. In each city ...
- 576D Flights for Regular Customers
分析 https://www.cnblogs.com/onioncyc/p/8037056.html 写的好像有点问题 但是大致就是这个意思 代码很好理解 代码 #include<bits/st ...
- 【CodeForces】576 D. Flights for Regular Customers
[题目]D. Flights for Regular Customers [题意]给定n个点m条边的有向图,每条边有di表示在经过该边前必须先经过di条边,边可重复经过,求1到n的最小经过边数.n,m ...
- 「CF576D」 Flights for Regular Customers
「CF576D」 Flights for Regular Customers 对不起我又想网络流去了 你看这长得多像啊,走过至少多少条边就是流量下界,然后没上界 但是这个题求的最少走多少条边啊...完 ...
随机推荐
- vue.js笔记1.0
事件: 事件冒泡行为: 1.@click="show($event)" show:function (ev) { ev.cancelBubble=true; } 2.@click. ...
- PHP将html内容转换为image图片
/** * 将html内容转换为image图片 * @param $htmlcontent * @param $toimagepath * @author james.ou 2011-11-1 */ ...
- Python基础——概述
新建Python代码 Jupyter Notebook是在浏览器中运行的. 地址栏输入http://localhost:8888后直接进入工作文件夹,显示文件夹中的内容. 右上角选择New——Pyth ...
- python-函数基础、函数参数
目录 函数的基础 什么是函数 为何用函数 如何调用函数 定义函数的三种形式 无参函数 有参函数 空函数 函数的返回值 什么是返回值 为什么要有返回值 函数的调用 函数参数的应用 形参和实参 位置参数 ...
- Hadoop4.2HDFS测试报告之六
测试结论 第一组数据作表格作图: 第二组数据作表格作图: 根据以上图分析得出以下结论: 1. 本地存储的读写速率基本保持23M左右,说明本地存储比较稳定. 2. HDFS存储两个数据节点的读写速率性能 ...
- RQNOJ:PID30 / [stupid]愚蠢的矿工☆(树形背包)
PID30 / [stupid]愚蠢的矿工☆ 背景 Stupid 家族得知在HYC家的后花园里的中央花坛处,向北走3步,向西走3步,再向北走3步,向东走3步,再向北走6步,向东走3步,向南走12步,再 ...
- python网络编程相关
什么是网络套接字socket?简述基于tcp协议的套接字的通信流程. 为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)的接口,区分 ...
- python基础学习笔记——网络编程(协议篇)
一 互联网的本质 咱们先不说互联网是如何通信的(发送数据,文件等),先用一个经典的例子,给大家说明什么是互联网通信. 现在追溯到八九十年代,当时电话刚刚兴起,还没有手机的概念,只是有线电话,那么此时你 ...
- 24、AES RSA加密处理记录
一.加密过程解释 前提:发送方为A,接受方为B牢记:RSA为非对称加密,AES为对称加密.对称加密,属于传统的加密技术,加密和解密的秘钥都是相同的,AES的秘钥长度有128.192.256三种.非对称 ...
- python + selenium - 自动化环境搭建
1. 安装python (1)下载地址:https://www.python.org/downloads/windows/ (2)安装方式:默认安装即可 (3)环境变量配置:打开[系统属性]-[环境变 ...