「CF576D」 Flights for Regular Customers

对不起我又想网络流去了

你看这长得多像啊,走过至少多少条边就是流量下界,然后没上界

但是这个题求的最少走多少条边啊...完全不一样好吧...

然后又开始想最短路相关算法,然后觉得分层图可以直接跑,然后发现 \(d_i\le 10^9\),直接爆炸。

然后就不会了。

注意到恰好走过 \(k\) 条边的最短路是可以通过 \(\texttt{Floyd}\) 求得的。那如果我走 \(k\) 条边能够到达某个点,那么我从这个点出发一定能走到所有权值 \(\le k\) 的边上去。

这启发我们对所有边按照 \(d_i\) 从小到大排序。

然后每一次预先求出走 \(d_i\) 步能够到达的点,以这些点为起点进行 \(\texttt{BFS}\),得到的到终点的距离加上 \(d_i\) 就是可能的答案。

然后发现本题我们不需要知道最短路长度,我们只需要维护可达性,使用 \(\texttt{bitset}\) 进行优化即可。

总时间复杂度为 \(O(m\frac{n^3\log d}{w})\)。

/*---Author:HenryHuang---*/
/*---Never Settle---*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=155;
int dis[maxn],n,m;
struct edge{
int u,v,w;
bool operator<(const edge &h)const{
return w<h.w;
}
}e[maxn];
struct matrix{
bitset<maxn> a[maxn];
matrix operator *(const matrix &h)const{
matrix z;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(a[i][j]) z.a[i]|=h.a[j];
return z;
}
}ans,a;
void ksm(matrix a,int b){
while(b){
if(b&1) ans=ans*a;
b>>=1,a=a*a;
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;++i){
int a,b,c;cin>>a>>b>>c;
e[i]=(edge){a,b,c};
}
for(int i=1;i<=n;++i) ans.a[i][i]=1;
sort(e+1,e+m+1);
int Ans=2e9;
for(int i=1;i<=m;++i){
if(Ans<=e[i].w) break;
int delta=e[i].w-e[i-1].w;
ksm(a,delta);
a.a[e[i].u][e[i].v]=1;
queue<int> Q;
for(int j=1;j<=n;++j)
if(ans.a[1][j]) Q.emplace(j),dis[j]=0;
else dis[j]=-1;
while(!Q.empty()){
int u=Q.front();Q.pop();
for(int v=1;v<=n;++v)
if(a.a[u][v]&&dis[v]==-1) dis[v]=dis[u]+1,Q.emplace(v);
}
if(dis[n]!=-1) Ans=min(Ans,dis[n]+e[i].w);
}
if(Ans==2e9) cout<<"Impossible\n";
else cout<<Ans<<'\n';
return 0;
}

「CF576D」 Flights for Regular Customers的更多相关文章

  1. 题解 CF576D 【Flights for Regular Customers】

    对每条边来说,可以走这条边的限制解除是按\(d\)的顺序,所以先对每条边按\(d\)排序. 然后考虑每两条边之间的处理,用一个矩阵表示当前走\(d\)步是否可以从一个点到另一个点,称其为状态矩阵,用另 ...

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

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

  3. 【CodeForces】576 D. Flights for Regular Customers

    [题目]D. Flights for Regular Customers [题意]给定n个点m条边的有向图,每条边有di表示在经过该边前必须先经过di条边,边可重复经过,求1到n的最小经过边数.n,m ...

  4. Codeforces 576D Flights for Regular Customers(矩阵加速DP)

    题目链接  Flights for Regular Customers 首先按照$d$的大小升序排序 然后分成$m$个时刻,每条路径一次处理过来. $can[i][j]$表示当前时刻$i$能否走到$j ...

  5. CF576D. Flights for Regular Customers

    n<=150个点,m<=150条路,每条路Ai,Bi,Di表示Ai到Bi有一条有向边,使用他前至少要走Di条路,问1到n最少走几条路. 又是n^4过150的题.... 不同于传统的最短路, ...

  6. (中等) 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 ...

  7. Codeforces 576D Flights for Regular Customers 矩阵快速幂+DP

    题意: 给一个$n$点$m$边的连通图 每个边有一个权值$d$ 当且仅当当前走过的步数$\ge d$时 才可以走这条边 问从节点$1$到节点$n$的最短路 好神的一道题 直接写做法喽 首先我们对边按$ ...

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

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

  9. Codeforces 576D Flights for Regular Customers (图论、矩阵乘法、Bitset)

    题目链接 http://codeforces.com/contest/576/problem/D 题解 把边按\(t_i\)从小到大排序后枚举\(i\), 求出按前\((i-1)\)条边走\(t_i\ ...

随机推荐

  1. IOS 小组件(7):小组件点击交互

    引言   前面我们似乎掌握了实现一个小组件所需要的一切技能,默认情况下桌面点击小组件,也正常跳转到了App中.接下来我们一起来看看,小组件是怎么做到点击跳转到App的. 点击交互方式 点击Widget ...

  2. python实现布隆过滤器及原理解析

    python实现布隆过滤器及原理解析     布隆过滤器( BloomFilter )是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地 ...

  3. (转)修改python默认排序方式

    在Java中,自定义类可以通过继承comparable接口,重写compareTo方法来使用内置sort()函数来对自定义对象排序,我就在想Python中有没有类似的操作. 首先随便写个自定义类,比如 ...

  4. TensorFlow用法

    TensorFlow用法 什么是TensorFlow TensorFlow是一个开源软件库,用于使用数据流图进行数值计算.图中的节点表示数学运算,而图的边缘表示流动的多维数据数组(张量).这种灵活的体 ...

  5. CMOS图像传感器同时感知和处理光学图像

    CMOS图像传感器同时感知和处理光学图像 概述 近年来,机器视觉技术有了巨大的飞跃,现在已经成为各种智能系统的一个组成部分,包括自主车辆和机器人.通常,视觉信息由基于帧的摄像机捕获,转换成数字格式,然 ...

  6. 重新整理 mysql 基础篇————— 介绍mysql[一]

    前言 准备整理mysql的基础篇了,前面整理了sql语句序列的的<sql 语句系列(八百章)>,感觉很多用不上,就停下来了,后续还是会继续整理. mysql 基础篇主要是对一些基础进行整理 ...

  7. JVM中的堆的新生代、老年代、永久代详解

    JVM中的堆一般分为三大部分:新生代.老年代.永久代,其大致的占比如下:  一.新生代 新生代主要用来存放新生的对象.一般占据堆空间的1/3.在新生代中,保存着大量的刚刚创建的对象,但是大部分的对象都 ...

  8. BP-Wrapper:无锁竞争的缓存替换算法系统框架

    BP-Wrapper:无锁竞争的替换算法系统框架 最近看了一个golang的高性能缓存ristretto,该缓存可以很好地实现如下功能: Concurrent High cache-hit ratio ...

  9. 【渗透实战】那些奇葩的WAF_第二期_无意发现通杀漏洞,空字节突破上传!

    /文章作者:Kali_MG1937 CSDN博客号:ALDYS4 QQ:3496925334 未经许可,禁止转载/ 该博文为本人18年左右的渗透记录,文法粗糙,技术含量极低,流水账文章,且今日不知为何 ...

  10. 【NX二次开发】UF_CSYS_map_point()函数,绝对坐标,工作坐标,部件之间坐标转换。

    UF_CSYS_map_point用来变换点的坐标,比较简单且实用.例如工作坐标系与绝对坐标系转换,一个部件的坐标与另一个部件坐标系之间的转换.下面的例子是在三个坐标下创建三个点相对坐标为{10,50 ...