「CF576D」 Flights for Regular Customers
「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的更多相关文章
- 题解 CF576D 【Flights for Regular Customers】
对每条边来说,可以走这条边的限制解除是按\(d\)的顺序,所以先对每条边按\(d\)排序. 然后考虑每两条边之间的处理,用一个矩阵表示当前走\(d\)步是否可以从一个点到另一个点,称其为状态矩阵,用另 ...
- CF576D Flights for Regular Customers 矩阵乘法 + Bitset优化
%%%cxhscst2's blog Codeforces 576D Flights for Regular Customers(矩阵加速DP) 代码非常优美 + 简洁,学习到了 Code: #inc ...
- 【CodeForces】576 D. Flights for Regular Customers
[题目]D. Flights for Regular Customers [题意]给定n个点m条边的有向图,每条边有di表示在经过该边前必须先经过di条边,边可重复经过,求1到n的最小经过边数.n,m ...
- Codeforces 576D Flights for Regular Customers(矩阵加速DP)
题目链接 Flights for Regular Customers 首先按照$d$的大小升序排序 然后分成$m$个时刻,每条路径一次处理过来. $can[i][j]$表示当前时刻$i$能否走到$j ...
- CF576D. Flights for Regular Customers
n<=150个点,m<=150条路,每条路Ai,Bi,Di表示Ai到Bi有一条有向边,使用他前至少要走Di条路,问1到n最少走几条路. 又是n^4过150的题.... 不同于传统的最短路, ...
- (中等) 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 ...
- Codeforces 576D Flights for Regular Customers 矩阵快速幂+DP
题意: 给一个$n$点$m$边的连通图 每个边有一个权值$d$ 当且仅当当前走过的步数$\ge d$时 才可以走这条边 问从节点$1$到节点$n$的最短路 好神的一道题 直接写做法喽 首先我们对边按$ ...
- Codeforces 576D. Flights for Regular Customers(倍增floyd+bitset)
这破题调了我一天...错了一大堆细节T T 首先显然可以将边权先排序,然后逐个加进图中. 加进图后,倍增跑跑看能不能到达n,不能的话加新的边继续跑. 倍增的时候要预处理出h[i]表示转移矩阵的2^0~ ...
- Codeforces 576D Flights for Regular Customers (图论、矩阵乘法、Bitset)
题目链接 http://codeforces.com/contest/576/problem/D 题解 把边按\(t_i\)从小到大排序后枚举\(i\), 求出按前\((i-1)\)条边走\(t_i\ ...
随机推荐
- scrapy异常状态码处理
scrapy异常状态码处理 在setting.py中加入 scrapy 的 state 默认只处理200到300之间 # 403状态的响应不被自动忽略,对403 的响应做个性化处理 HTTPERRO ...
- node.js学习(7)流和管道
1 导入模块 输入流 # 读取流 # 写入流 # # 管道 # 压缩 # 解压缩
- 07.ElementUI 2.X 源码学习:源码剖析之工程化(二)
0x.00 前言 项目工程化系列文章链接如下,推荐按照顺序阅读文章 . 1️⃣ 源码剖析之工程化(一):项目概览.package.json.npm script 2️⃣ 源码剖析之工程化(二):项目构 ...
- SQL Server 50道查询训练题,学生Student表
下面这个是题目所用到的数据库! 首先你需要在你的SQL Sever数据库中创建[TestDb]这个数据库,接下来下面这个代码.直接复制在数据库里运行就好了! 1 USE [TestDb] 2 GO 3 ...
- TensorFlow文本情感分析实现
TensorFlow文本情感分析实现 前面介绍了如何将卷积网络应用于图像.本文将把相似的想法应用于文本. 文本和图像有什么共同之处?乍一看很少.但是,如果将句子或文档表示为矩阵,则该矩阵与其中每个单元 ...
- list 分批导入db, 每1000条数据一批 , 从字符串中获取数字,小数, 版本号比较
//这个有个弊端: 分组后分批导入, 是阻塞的,我没有导入完成,别人就不能导入, 这里可以优化成异步,线程池 public static void main(String[] args) { Rand ...
- vulhub-struct2-s2-005
0x00 漏洞原理 s2-005漏洞的起源源于S2-003(受影响版本: 低于Struts 2.0.12),struts2会将http的每个参数名解析为OGNL语句执行(可理解为java代码).O ...
- Java面试必知必会:基础
面试考察的知识点多而杂,要完全掌握需要花费大量的时间和精力.但是面试中经常被问到的知识点却没有多少,你完全可以用 20% 的时间去掌握 80% 常问的知识点. 一.基础 包括: 杂七杂八 面向对象 数 ...
- Qt自定义信号槽的使用浅析+实例
1. Qt中自定义信号槽的使用 Qt框架提供的信号槽在某些特定场景下是无法满足我们的项目需求的,因此我们还设计自己需要的的信号和槽,使用connect()对自定义的信号槽进行连接. 如果想要使用自定义 ...
- UF_CSYS 坐标系操作
Open C UF_CSYS_ask_csys_info 获取WCS坐标系的原点坐标和矩阵标识UF_CSYS_ask_matrix_of_object 获得对象 ...