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\ ...
随机推荐
- 测开之路一百零九:bootstrap列表
bootstrap列表 引入bootstrap标签 原本的效果 水平显示 bootstrap列表 列表组合框 在组合框后面加备注 突出显示 a标签列表 <!DOCTYPE html>< ...
- 抓包工具之—charles碎言碎语
一.Charles常见使用场景: 1.Charles是跨平台的抓包工具,支持Windows,mac或Linux平台: 2.获取请求信息.测试接口时,若接口文档中的参数不清楚或没有接口文档时,可以通过抓 ...
- winform控件CxFlatUI
CxFlatUI https://github.com/HuJinguang/CxFlatUI 当前控件 AlertBox Button CheckBox DatePicker GroupBox ...
- MVC 源码系列之路由(二)
MVCParseData和Match方法的实现 ### ParseData 那么首先要了解一下ParseData. //namespace Route public string Url { get ...
- WordPress 数据库结构及表字段作用解析
对于WordPress的开发可以说子凡已经是如痴如醉了,通过 WordPress 本身的开放性接口可以做到很多的事情,但是有些时候我们可能更喜欢直接查询数据库来实现某些 WordPress 没有提供的 ...
- oracle--批量删除部分表,将某一列拼接成字符串
1.查询要批量删除的表 SELECT * FROM USER_TABLES SELECT 'DROP '||'TABLE ' || TABLE_NAME ||' ;' ,1 FROM USER_TAB ...
- python基础-4 函数参数引用、lambda 匿名函数、内置函数、处理文件
上节课总结 1.三元运算 name=“name1”if 条件 else “name2” 2.深浅拷贝 数字.字符串 深浅,都一样 2.其他 浅拷贝:只拷贝第一层 深拷贝:不拷贝最后一层 3.set集合 ...
- The Log-Structured Merge-Tree(译)
coming from http://duanple.blog.163.com/blog/static/7097176720120391321283/
- Java代码执行过程概述
Java代码经历三个阶段:源代码阶段(Source) -> 类加载阶段(ClassLoader) -> 运行时阶段(Runtime) 首先我们来理清一下Java代码整个执行过程, 让我们对 ...
- Java学习day11-类的成员之三:构造器(构造方法)
一.构造器(构造方法) 语法格式: 修饰符 类名(参数列表){ 初始化语句: } 构造器的特征: 1.它具有与类相同的名称 2.它不声明返回值类型.(与声明为void不同) 3.不能被static.f ...