「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. Linux-SSH介绍与认证方式

    Linux SSH 前言: 在实际的生产环境中,运维人员经常要使用本地的计算机对远程主机进行控制工作,TCP/IP协议提供了两种协议来完成这样的操作,分别为Telnet协议和SSH协议. 由于Teln ...

  2. bat脚本总结

    1.修改密码 @echo off set /p b=请输入新密码: net user %username% %b% echo 密码修改成功 %b% 请牢记你的密码 pause 2.删除hosts文件并 ...

  3. 多目标跟踪:CVPR2019论文阅读

    多目标跟踪:CVPR2019论文阅读 Robust Multi-Modality Multi-Object Tracking  论文链接:https://arxiv.org/abs/1909.0385 ...

  4. HiCar SDK概述

    HiCar SDK概述 HUAWEI HiCar SDK 是 HUAWEI HiCar(以下简称 HiCar )为汽车硬件设备提供的软件开发工具包,为汽车硬件厂商接入 HiCar 提供应用 API 接 ...

  5. PointRCNN: 点云的3D目标生成与检测

    PointRCNN: 点云的3D目标生成与检测 PointRCNN: 3D Object Proposal Generation and Detection from Point Cloud 论文地址 ...

  6. LLVM编译器架构

    LLVM编译器架构 LLVM概述 LLVM项目是模块化和可重用的编译器及工具链技术的集合.尽管名称如此,LLVM与传统虚拟机关系不大.名称" LLVM"本身不是缩写.它是项目的全名 ...

  7. 自动化工具之Appium工具简单介绍

    背景 自动化,性能测试,接口测试,开发平台等工作,到底测试的价值在哪里,其实价值来源不断充实与为大众服务,今天简单介绍ui小工具appium攻击. 简单介绍 Appium 是一个自动化测试开源工具,支 ...

  8. WordPress安装篇(2):用宝塔面板在Windows上安装WordPress

    上一篇文章介绍了如何使用PHPStudy工具在Windows Server环境安装WordPress,接下来介绍一款更加强大的部署WordPress的集成工具--宝塔面板.宝塔面板不仅提供免费版本,还 ...

  9. MySQL零散知识点(01)

    内容概要 --- 表字段操作补充(掌握) --- python操作MySQL(掌握) --- 视图(了解) --- 触发器(了解) --- 存储过程(了解) --- 事务(掌握) --- 内置函数(了 ...

  10. PAT甲级 1093 Count PAT‘s (25 分) 状态机解法

    题目 原题链接 The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the ...