CF576D Flights for Regular Customers 矩阵乘法 + Bitset优化
Codeforces 576D Flights for Regular Customers(矩阵加速DP)
代码非常优美 + 简洁,学习到了
Code:
#include <bits/stdc++.h>
#define N 160
#define inf 0x3f3f3f3f
#define maxn 1000000
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
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];
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j) if(a[i][j]) ret[i]|=b[j];
for(int i=1;i<=n;++i) a[i]=ret[i];
}
void Pow(bitset<N>*a,int b)
{
bitset<N>ret[N];
for(int i=1;i<=n;++i) ret[i][i]=1;
for(;b;b>>=1)
{
if(b&1) Mul(ret, a);
Mul(a,a);
}
for(int i=1;i<=n;++i) a[i]=ret[i];
}
int main()
{
// setIO("input");
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i) e[i].scan();
sort(e+1,e+1+m);
for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) dis[i][j]=inf;
for(int i=1;i<=n;++i) dis[i][i]=0;
cnt=0,ans=inf;
for(int i=1;i<=n;++i) can[i][i]=1;
for(int i=1;i<=m;++i)
{
int x=e[i].x,y=e[i].y,d=e[i].d;
for(int j=1;j<=n;++j) tmp[j]=base[j];
Pow(tmp, d-cnt);
Mul(can,tmp);
for(int j=1;j<=n;++j) for(int k=1;k<=n;++k) dis[j][k]=min(dis[j][k], dis[j][x]+1+dis[y][k]);
for(int j=1;j<=n-1;++j) 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 printf("Impossible\n");
return 0;
}
CF576D Flights for Regular Customers 矩阵乘法 + Bitset优化的更多相关文章
- CF576D. Flights for Regular Customers
n<=150个点,m<=150条路,每条路Ai,Bi,Di表示Ai到Bi有一条有向边,使用他前至少要走Di条路,问1到n最少走几条路. 又是n^4过150的题.... 不同于传统的最短路, ...
- Codeforces 576D Flights for Regular Customers 矩阵快速幂+DP
题意: 给一个$n$点$m$边的连通图 每个边有一个权值$d$ 当且仅当当前走过的步数$\ge d$时 才可以走这条边 问从节点$1$到节点$n$的最短路 好神的一道题 直接写做法喽 首先我们对边按$ ...
- Codeforces 576D Flights for Regular Customers(矩阵加速DP)
题目链接 Flights for Regular Customers 首先按照$d$的大小升序排序 然后分成$m$个时刻,每条路径一次处理过来. $can[i][j]$表示当前时刻$i$能否走到$j ...
- CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset+bfs
CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset https://www.luogu.org/problemnew/show/CF57 ...
- 「CF576D」 Flights for Regular Customers
「CF576D」 Flights for Regular Customers 对不起我又想网络流去了 你看这长得多像啊,走过至少多少条边就是流量下界,然后没上界 但是这个题求的最少走多少条边啊...完 ...
- 【CodeForces】576 D. Flights for Regular Customers
[题目]D. Flights for Regular Customers [题意]给定n个点m条边的有向图,每条边有di表示在经过该边前必须先经过di条边,边可重复经过,求1到n的最小经过边数.n,m ...
- Codevs 1305 Freda的道路(矩阵乘法 DP优化)
1305 Freda的道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description Freda要到Rainbow的城堡去玩了.我们可以认 ...
- Codeforces 576D - Flights for Regular Customers(bitset 优化广义矩阵乘法)
题面传送门 题意: 有一张 \(n\) 个点 \(m\) 条边的有向图,你初始在 \(1\) 号点,边上有边权 \(c_i\) 表示只有当你经过至少 \(c_i\) 条边的时候你才能经过第 \(i\) ...
- Codeforces 576D Flights for Regular Customers (图论、矩阵乘法、Bitset)
题目链接 http://codeforces.com/contest/576/problem/D 题解 把边按\(t_i\)从小到大排序后枚举\(i\), 求出按前\((i-1)\)条边走\(t_i\ ...
随机推荐
- ROW/COW 快照技术原理解析
NOTE:ROW/COW 最新更新请跳转<再谈 COW.ROW 快照技术> 目录 目录 快照与备份的区别 Snapshot 快照技术 全量快照 增量快照 COW 写时拷贝快照技术 ROW ...
- 测开之路九十八:js变量和语句
这里为了方便调试,在jsbin网站上面编写js脚本:https://jsbin.com/?js,console 可以点击增加/减少对应展示分页,Console为控制台部分,Output为页面部分 变量 ...
- lateral view 使用方法
这个函数相当于拆开行变成列. 可以理解为行转列. select id,order_label from table_bx lateral view explode(split(work_order_l ...
- 【SD系列】SAP SD和QM模块常用bapi
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP SD和QM模块常用bapi ...
- 疯狂Java学习
面向对象(下) 6.3:类成员:又讲了一遍static修饰的类成员: Singleten(单例)类: 通过封装的方式,实现了一个类只能创建一次,应该是为了更好编写代码,创造的一个概念. 6.4:f ...
- 2019年华南理工大学软件学院ACM集训队选拔赛 Round1
TIps: 1.所有代码中博主使用了scanf和printf作为输入输出 2.代码中使用了define LL long long 所以在声明变量的时候 LL其实就等价于long long 希望这两点 ...
- SpringBoot内嵌数据库的使用(H2)
配置数据源(DataSource) Java的javax.sql.DataSource接口提供了一个标准的使用数据库连接的方法. 传统做法是, 一个DataSource使用一个URL以及相应的证书去构 ...
- Linux下CMake简明教程
转载地址:https://blog.csdn.net/whahu1989/article/details/82078563 CMake是开源.跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本 ...
- Python内建函数enumerate()用法及在for循环应用
Python 内建函数enumerate() 由于这个单纯很长,不容易记住,用法还是比较广泛的,下面讲述Python内建函数enumerate()用法. 1,实例 enumerate(sequence ...
- 正则表达式RegExp对象
3.1 正则表达式对象的创建方式 字面量的方式 var patt = /匹配规则/修饰符; / --> 边界的意思 new关键字 var patt = new RegExp( ...