题目大意:有$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)$

  1. #include<bits/stdc++.h>
  2. #define M 105
  3. #define INF 1234567890
  4. using namespace std;
  5.  
  6. struct mat{
  7. bool a[M][M]; int n,m;
  8. mat(){memset(a,,sizeof(a));}
  9. mat(int nn,int mm){memset(a,,sizeof(a)); n=nn; m=mm;}
  10. void set1(){memset(a,,sizeof(a)); for(int i=;i<=n;i++) a[i][i]=;}
  11. friend mat operator *(mat a,mat b){
  12. mat c=mat(a.n,b.m);
  13. for(int i=;i<=a.n;i++)
  14. for(int k=;k<=b.n;k++) if(a.a[i][k])
  15. for(int j=;j<=a.m;j++)
  16. c.a[i][j]|=a.a[i][k]&b.a[k][j];
  17. return c;
  18. }
  19. friend mat operator ^(mat a,int b){
  20. mat ans=mat(a.n,a.m); ans.set1();
  21. while(b){
  22. if(b&) ans=ans*a;
  23. b=b>>; a=a*a;
  24. }
  25. return ans;
  26. }
  27. }a,b;
  28. struct edge{
  29. int u,v,t;
  30. void rd(){scanf("%d%d%d",&u,&v,&t);}
  31. friend bool operator <(edge a,edge b){return a.t<b.t;}
  32. }p[M];
  33. int n,m,ans=INF;
  34. int main(){
  35. scanf("%d%d",&n,&m);
  36. a=mat(,n); b=mat(n,n); a.a[][]=;
  37. if(n==) {printf("0\n"); return ;}
  38. for(int i=;i<=m;i++) p[i].rd();
  39. sort(p+,p+m+);
  40. for(int i=;i<=m;i++){
  41. mat hh=a;
  42. b.a[p[i].u][p[i].v]=;
  43. for(int j=;j<=n;j++){
  44. hh=hh*b;
  45. if(hh.a[][n]){
  46. ans=min(ans,p[i].t+j);
  47. break;
  48. }
  49. }
  50. if(i<m) a=a*(b^(p[i+].t-p[i].t));
  51. }
  52. if(ans==INF) printf("Impossible\n");
  53. else printf("%d\n",ans);
  54. }

【xsy2748】 fly 矩阵快速幂的更多相关文章

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

  2. 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)

    题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...

  3. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...

  4. 51nod 1113 矩阵快速幂

    题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...

  5. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

    还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...

  6. 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 ...

  7. 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 输 ...

  8. hdu2604(递推,矩阵快速幂)

    题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...

  9. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

随机推荐

  1. pyspider示例代码四:搜索引擎爬取

    搜索引擎爬取 #!/usr/bin/env python # -*- encoding: utf- -*- # Created on -- :: # Project: __git_lab_fix fr ...

  2. 2018.09.30 bzoj2821: 作诗(Poetize)(分块)

    传送门 分块经典题目. 先将数列分块. 然后预处理出每两个块之间有多少个数出现了正偶数次. 这样查询的时候对于中间的完整块直接用预处理出的数组搞定. 剩下的暴力枚举求解. 代码: #include&l ...

  3. 2018.09.27 hdu5564Clarke and digits(数位dp+矩阵快速幂)

    传送门 好题啊. 我只会写l,rl,rl,r都很小的情况(然而题上并没有这种数据范围). 但这个dp转移式子可以借鉴. 我们用f[i][j][k]f[i][j][k]f[i][j][k]表示当前在第i ...

  4. 2018.09.02 bzoj1296: [SCOI2009]粉刷匠(dp套dp)

    传送门 dp好题. 先推出对于每一行花费k次能最多粉刷的格子数. 然后再推前i行花费k次能最多粉刷的格子数. 代码: #include<bits/stdc++.h> #define N 5 ...

  5. Django入门与实践-第23章:分页实现(完结)

    http://127.0.0.1:8000/boards/1/ #从现在起,我们将在 board_topics 这个视图中来操作. python manage.py shell from django ...

  6. dos常用命令使用说明

    cd 改变当前目录 sys 制作DOS系统盘 copy 拷贝文件 del 删除文件 deltree 删除目录树 dir 列文件名 diskcopy 制磁盘 edit 文本编辑 format 格式化磁盘 ...

  7. jQueryUI datepicker 报错: TypeError: inst is undefined

    前提:要引用的js等都引用好了 调用日期控件的input: <input id="starttime" name="starttime" class=&q ...

  8. struts2从浅至深(三)拦截器

    一:拦截器概述 Struts2中的很多功能都是由拦截器完成的. 是AOP编程思想的一种应用形式. 二:拦截器执行时机                             interceptor表示 ...

  9. ssh远程调用之shell脚本远程调用应用程序

    1.引子 前几天有一个需求是这样的:本机的shell脚本,通过远程调用另一台机子上的shell脚本,来完成对远程机子上分发的Java程序的执行和其他操作.看上去挺容易,实际上也不难. 第一步:用scp ...

  10. hdu 5067 遍历指定点集最小时间

    http://acm.hdu.edu.cn/showproblem.php?pid=5067 贴题解 由于Harry的dig machine是无限大的,而装载石头和卸载石头是不费时间的,所以问题可以转 ...