【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 ...
随机推荐
- 2018.10.01 NOIP模拟 卡牌游戏(贪心)
传送门 简单贪心题. 然而考试的时候失了智少讨论了一种情况导致gg. 实际上用到了二分图匹配的思想,L每次找到刚好比当前的牌小一点的出出去,看能匹配几个. 如何处理? 我们先考虑第一种比分策略. 我们 ...
- 2018.09.07 codeforces311B. Cats Transport(斜率优化dp)
传送门 斜率优化dp好题. 对于第i只猫,显然如果管理员想从出发开始刚好接到它,需要在t[i]=h[i]−dist(1,i)" role="presentation" s ...
- 2018.08.10 atcoder Median Sum(01背包)
传送门 题意简述:输入一个数组an" role="presentation" style="position: relative;">anan. ...
- arduino一些内容
arduino 套件使用说明书V1.0.pdf, 步进电机 DHT11 传感器另外一脚要接A0 /* Web client This sketch connects to a website (htt ...
- 一个简单的Linux后门程序的实现
该程序实质是一个简单的socket编程,在受害方上运行攻击代码(后门进程),通过socket打开一个预设端口,并监听,等待攻击方的链接.一旦攻击方通过网络链接工具试图链接该socket,那么后门进程立 ...
- 右值引用和std::move函数(c++11)
1.对象移动 1)C++11新标准中的一个最主要的特性就是移动而非拷贝对象的能力 2)优势: 在某些情况下,从旧内存拷贝到新内存是不必要的,此时对对象进行移动而非拷贝可以提升性能 有些类如IO类或un ...
- 设定Word段落的背景色
段落背景不同于文字区别.很多新接触word的朋友都找不到怎么弄. 先把光标停留在需要设置的段落文字上,或者选择需要设置的段落文字. 点击段落里的边框和底纹,如图 在弹出框中选择底纹. 选择需要填充的颜 ...
- Getting Started with Google Tango(Google Tango开始教程)
https://developers.google.com/tango/ Build apps that understand space and motion in high fidelity on ...
- Codeforces758A Holiday Of Equality 2017-01-20 10:08 48人阅读 评论(0) 收藏
A. Holiday Of Equality time limit per test 1 second memory limit per test 256 megabytes input standa ...
- cordova3.X-4.0添加自定义插件方法
cordova3.X之后,插件不能自己手动添加了,手动添加后,只要cordova build,数据立即被抹去. 因此,3.X后要添加插件,需要用 cordova plungin add "你 ...