CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset

https://www.luogu.org/problemnew/show/CF576D


按d排序,然后对于两个相邻的d,设map[i][j][k]表示从i到j走k步能否走到。

走di-di-1步可以用矩乘优化一下。

对于1和n连通的所有情况,跑一遍bfs,取min即可获得答案。

需要加bitset。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <bitset>
using namespace std;
int vis[160],Q[160],l,r,dis[160];
int n,m,a[160][160];
struct Mat {
bitset<151>v[151];
Mat operator * (const Mat &x) const {
Mat re;int i,j;
for(i=1;i<=n;i++) {
for(j=1;j<=n;j++) {
if(v[i][j]) re.v[i]|=x.v[j];
}
}
return re;
}
}MAP,RE;
void Qp(int y) {
int i,j;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) MAP.v[i][j]=a[i][j];
for(;y;y>>=1,MAP=MAP*MAP) {
if(y&1) RE=RE*MAP;
}
}
struct A {
int x,y,z;
bool operator < (const A &u) const {
return z<u.z;
}
}e[160];
bool bfs() {
l=r=0; memset(dis,0,sizeof(dis)); memset(vis,0,sizeof(vis));
int i;
for(i=1;i<=n;i++) if(RE.v[1][i]) Q[r++]=i,vis[i]=1;
while(l<r) {
int x=Q[l++];
for(i=1;i<=n;i++) {
if(a[x][i]&&!vis[i]) {
vis[i]=1; Q[r++]=i; dis[i]=dis[x]+1;
}
}
}
return vis[n];
}
int main() {
scanf("%d%d",&n,&m);
int i,j=0;
for(i=1;i<=m;i++) {
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
}
sort(e+1,e+m+1);
int lst=0,ans=1<<30; RE.v[1][1]=1;
while(1) {
// puts("FUCK");
for(i=j+1;i<=m;i++) {
if(e[i].z>lst) break;
a[e[i].x][e[i].y]=1; j++;
}
if(bfs()) ans=min(ans,lst+dis[n]);
if(j==m) break;
Qp(e[j+1].z-lst);
lst=e[j+1].z;
}
// for(i=1;i<=n;i++) {for(j=1;j<=n;j++) printf("%d ",RE.v[i][j]==1);puts("");}
if(ans==1<<30) puts("Impossible");
else printf("%d\n",ans);
}
/*
3 2
1 2 0
2 3 1 3 3
2 1 0
2 3 6
1 2 0
*/

CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset+bfs的更多相关文章

  1. bzoj 2165: 大楼【Floyd+矩阵乘法+倍增+贪心】

    1<<i的结果需要是long long的话i是long long是没用的--要写成1ll<<i--我别是个傻子吧 虽然写的是二进制贪心,但是我觉得二分可能更好写吧(但是会慢) ...

  2. BZOJ4386[POI2015]Wycieczki——矩阵乘法+倍增

    题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入 第 ...

  3. Codeforces 576D. Flights for Regular Customers(倍增floyd+bitset)

    这破题调了我一天...错了一大堆细节T T 首先显然可以将边权先排序,然后逐个加进图中. 加进图后,倍增跑跑看能不能到达n,不能的话加新的边继续跑. 倍增的时候要预处理出h[i]表示转移矩阵的2^0~ ...

  4. CF576D Flights for Regular Customers 矩阵乘法 + Bitset优化

    %%%cxhscst2's blog Codeforces 576D Flights for Regular Customers(矩阵加速DP) 代码非常优美 + 简洁,学习到了 Code: #inc ...

  5. poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)

    Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7825   Accepted: 3068 Descri ...

  6. POJ3613 Cow Relays [矩阵乘法 floyd类似]

    Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7335   Accepted: 2878 Descri ...

  7. CF781D Axel and Marston in Bitland [倍增 矩阵乘法 bitset]

    Axel and Marston in Bitland 好开心第一次补$F$题虽然是$Div.2$ 题意: 一个有向图,每条边是$0$或$1$,要求按如下规则构造一个序列然后走: 第一个是$0$,每次 ...

  8. BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)

    题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...

  9. 【Floyd矩阵乘法】BZOJ1706- [usaco2007 Nov]relays 奶牛接力跑

    [题目大意] 给出一张无向图,求出恰巧经过n条边的最短路. [思路] 首先题目中只有100条边,却给出了10000个点(实际上最多只能有200个),离散化一下. 后面就是Floyd的新姿势,以前看过的 ...

随机推荐

  1. Codeforces 655E Beautiful Subarrays【01trie树】

    题目链接: http://codeforces.com/contest/665/problem/E 题意: 求异或值大于给定K的区间个数. 分析: 首先我们可以得到区间前缀的异或值. 这样我们将这个前 ...

  2. Golang 入门 : 等待 goroutine 完成任务

    Goroutine 是 Golang 中非常有用的功能,但是在使用中我们经常碰到下面的场景:如果希望等待当前的 goroutine 执行完成,然后再接着往下执行,该怎么办?本文尝试介绍这类问题的解决方 ...

  3. php 笔记 汇总 学习

    php命令行:通过命令行进入到当前要被执行的php文件路径,然后输入php环境可执行路径(后面包含php.exe),然后输入要被执行的php文件,比如runData.php即可. php框架:yaf. ...

  4. Hijacking FM Radio with a Raspberry Pi & Wire

    转载:https://null-byte.wonderhowto.com/how-to/hack-radio-frequencies-hijacking-fm-radio-with-raspberry ...

  5. Webstorm上面通过babel将es6转化为es5

    1.首先创建一个新的文件夹(名为do);2.然后再根目录下面新建一个package.json,只需要写明两个属性即name和version,这个没有必须要和下面我写的一致,可以自行定义. { &quo ...

  6. Mac电脑解压文件unrar用密码问题解决

    下载了一个rar文件,有密码的,你懂的. 但是在mac上面,用unrar解压,只能解出空文件:用izip解压,直接停在那里不动. 只好上网搜索.找到了办法. 用brew 安装了命令行版本的 unrar ...

  7. C/C++中static关键字作用总结 && 指针与引用的比较

    static作用: 常规答案: 1. 全局变量的隐藏:2. 函数体内记忆功能:3.类所有实例共享,static函数不接受this指针,只能访问static成员变量. 拓展:1.全局变量的隐藏,因为在其 ...

  8. SQL存储过程实例详解

    本文用3个题目,从建立数据库到创建存储过程,详细讲解数据库的功能. 题目1         学校图书馆借书信息管理系统建立三个表:         学生信息表:student 字段名称 数据类型 说明 ...

  9. linux操作系统下查看某rpm包是32bit 还是x64bit的命令

    [root@hosta ~]# rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n" | grep l ...

  10. centos Linux 常用命令汇总

    CentOS 关闭防火墙 1) 永久性生效,重启后不会复原 开启: chkconfig iptables on 关闭: chkconfig iptables off 2) 即时生效,重启后复原 开启: ...