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. (3)Swing常用组件

    JTextField-文本框 继承自javax.swing.text.JTextComponent类

  2. 使用Crypto对数据进行加密解密

    注释都在代码里: 先撸客户端: from Crypto.Cipher import AES import base64,requests class Message(object): def __in ...

  3. BZOJ1017魔兽地图DotR 樹形DP

    @(BZOJ)[樹形DP, 三維DP] Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA ...

  4. Spring中使用byName实现Beans自动装配

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/beans-auto-wiring/spring-autowiring-byname.html: 此 ...

  5. 创建注记图层C# IFeatureWorkspaceAnno

    http://blog.csdn.net/mydriverc/article/details/1675613     //IFeatureWorkspaceAnno Example     //The ...

  6. Android PullToRefresh 下拉刷新,上拉很多其它,支持ScrollView,ListView,可方便拓展GridView,WebView等

    在写着东西之前.从网上找到非常多这方面的源代码,可是基本没有找到惬意的.包含在GitHub上的比較有名的Android-PullToRefresh-master.思来想去还是自己写吧.当然当中借鉴了一 ...

  7. 单词number 和 numeral 的区别

    原文: http://blog.sina.com.cn/s/blog_72cd06360100vn7t.html be of 的用法,相当于表征特征或属性的形容词. 简单地说,“of + 名词”等于“ ...

  8. 三联动 支持ie6,ie7 省,市,区

    三联动 支持ie6,ie7 省,市,区 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <tit ...

  9. CF 568A(Primes or Palindromes?-暴力推断)

    A. Primes or Palindromes? time limit per test 3 seconds memory limit per test 256 megabytes input st ...

  10. MVC Page分页控件

    MVCPage帮助类 控制器代码 public ActionResult Article(int? page) { //Session["ArticleClass"] = cont ...