【xsy2748】 fly 矩阵快速幂
题目大意:有$n$个点,$m$条有向边,其中第$i$条边需要在$t_i$秒后才出现在图上。
有一个人刚开始呆在$1$号节点,每秒钟他必须要选择一条从他所在位置走出去的边,走出去(如果没有的话这人就死了)
问你他从$1$号点走到$n$号所需的最少时间。
数据范围:$n,m≤100,max(t_i)≤10^9$
此题貌似是一个套路题
令$vis[T][i]$表示在时刻$T$,是否能够到达$i$号节点
我们可以用$O(m)$的时间基于$vis[T][i]$求出$vis[T+1][i]$。
然而这么搞复杂度直接爆炸了。
我们把$vis[T]$看做是一个$1\times n$的矩阵,我们构造加入前i+1条边的图的邻接矩阵$A$(矩阵显然是$n\times n$的)
不难发现$vis[T+1]=vis[T]\times A$,这里的乘法是矩阵乘法。
单次矩乘的复杂度是$O(n^2)$,加入矩阵快速幂转移就是$O(n^2\log(t_{i+1}-t_i))$。
然而这么求我们只会求出$vis$数组的某一些项,然而某条边被加入后是一直存在的。
不难发现我们只需要在时刻$t_{i+1}$的基础上再走上$n$步,就可以知道是否可以在加入这条边后到达终点(结论显然)
然后就没有了
时间复杂度:$O(n^3\log T)$
#include<bits/stdc++.h>
#define M 105
#define INF 1234567890
using namespace std; struct mat{
bool a[M][M]; int n,m;
mat(){memset(a,,sizeof(a));}
mat(int nn,int mm){memset(a,,sizeof(a)); n=nn; m=mm;}
void set1(){memset(a,,sizeof(a)); for(int i=;i<=n;i++) a[i][i]=;}
friend mat operator *(mat a,mat b){
mat c=mat(a.n,b.m);
for(int i=;i<=a.n;i++)
for(int k=;k<=b.n;k++) if(a.a[i][k])
for(int j=;j<=a.m;j++)
c.a[i][j]|=a.a[i][k]&b.a[k][j];
return c;
}
friend mat operator ^(mat a,int b){
mat ans=mat(a.n,a.m); ans.set1();
while(b){
if(b&) ans=ans*a;
b=b>>; a=a*a;
}
return ans;
}
}a,b;
struct edge{
int u,v,t;
void rd(){scanf("%d%d%d",&u,&v,&t);}
friend bool operator <(edge a,edge b){return a.t<b.t;}
}p[M];
int n,m,ans=INF;
int main(){
scanf("%d%d",&n,&m);
a=mat(,n); b=mat(n,n); a.a[][]=;
if(n==) {printf("0\n"); return ;}
for(int i=;i<=m;i++) p[i].rd();
sort(p+,p+m+);
for(int i=;i<=m;i++){
mat hh=a;
b.a[p[i].u][p[i].v]=;
for(int j=;j<=n;j++){
hh=hh*b;
if(hh.a[][n]){
ans=min(ans,p[i].t+j);
break;
}
}
if(i<m) a=a*(b^(p[i+].t-p[i].t));
}
if(ans==INF) printf("Impossible\n");
else printf("%d\n",ans);
}
【xsy2748】 fly 矩阵快速幂的更多相关文章
- (中等) 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 ...
- 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)
题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...
- 51nod 算法马拉松18 B 非010串 矩阵快速幂
非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...
- 51nod 1113 矩阵快速幂
题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...
- 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...
- HDU5950(矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:f(n) = f(n-1) + 2*f(n-2) + n^4,f(1) = a , f(2 ...
- 51nod 1126 矩阵快速幂 水
有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的值. Input 输 ...
- hdu2604(递推,矩阵快速幂)
题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
随机推荐
- 协议 protocol
协议声明类需要实现的的方法,为不同的类提供公用方法,一个类可以有多个协议,但只能有一个父类,即单继承.它类似java中的接口. 正式协议(formal protocol)--------------- ...
- 2018.07.23[PA2015]Siano(线段树)
[PA2015]Siano 描述 Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会长高a[i]厘 ...
- 47 On Interpersonal Relationship 关于人际关系
47 On Interpersonal Relationship 关于人际关系 ①Since we are social beings, the quality of our lives depend ...
- flask_web表单
一.配置 1.为了能够处理 web 表单,我们将使用 Flask-WTF,该扩展封装了 WTFForms 并且恰当地集成进 Flask 中.许多 Flask 扩展需要大量的配置,因此我们将要在 mic ...
- (KMP 模板)Number Sequence -- Hdu -- 1711
http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/Other ...
- SQL SERVER存储过程中使用事务与捕获异常
https://www.douban.com/note/559596669/ 格式类似于 CREATE PROCEDURE YourProcedure ASBEGIN SET NOCOUNT O ...
- ReportMachine OCX
http://rmachine.haotui.com/thread-55-1-1.html 偏高偏低提示 [IF( [RMDBDataSet1."abnormalIndicator" ...
- Android-ColorsUtil工具类
颜色工具类 public class ColorsUtil { private ColorsUtil() { throw new Error("Do not need instantiate ...
- asp.net Mvc 模型绑定项目过多会导致页面运行时间卡
asp.net Mvc 模型绑定项目过多会导致页面运行时间卡的问题. 解决方式就是采用ModelView方式进行精简,已减少模型绑定及验证的时间.
- 实例化MD5CryptoServiceProvider报错:此实现不是 Windows 平台 FIPS 验证的加密算法的一部分
System.InvalidOperationException: This implementation is not part of the Windows Platform FIPS valid ...