CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset+bfs
CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset
https://www.luogu.org/problemnew/show/CF576D
按d排序,然后对于两个相邻的d,设map[i][j][k]表示从i到j走k步能否走到。
走di-di-1步可以用矩乘优化一下。
对于1和n连通的所有情况,跑一遍bfs,取min即可获得答案。
需要加bitset。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <bitset>
using namespace std;
int vis[160],Q[160],l,r,dis[160];
int n,m,a[160][160];
struct Mat {
bitset<151>v[151];
Mat operator * (const Mat &x) const {
Mat re;int i,j;
for(i=1;i<=n;i++) {
for(j=1;j<=n;j++) {
if(v[i][j]) re.v[i]|=x.v[j];
}
}
return re;
}
}MAP,RE;
void Qp(int y) {
int i,j;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) MAP.v[i][j]=a[i][j];
for(;y;y>>=1,MAP=MAP*MAP) {
if(y&1) RE=RE*MAP;
}
}
struct A {
int x,y,z;
bool operator < (const A &u) const {
return z<u.z;
}
}e[160];
bool bfs() {
l=r=0; memset(dis,0,sizeof(dis)); memset(vis,0,sizeof(vis));
int i;
for(i=1;i<=n;i++) if(RE.v[1][i]) Q[r++]=i,vis[i]=1;
while(l<r) {
int x=Q[l++];
for(i=1;i<=n;i++) {
if(a[x][i]&&!vis[i]) {
vis[i]=1; Q[r++]=i; dis[i]=dis[x]+1;
}
}
}
return vis[n];
}
int main() {
scanf("%d%d",&n,&m);
int i,j=0;
for(i=1;i<=m;i++) {
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
}
sort(e+1,e+m+1);
int lst=0,ans=1<<30; RE.v[1][1]=1;
while(1) {
// puts("FUCK");
for(i=j+1;i<=m;i++) {
if(e[i].z>lst) break;
a[e[i].x][e[i].y]=1; j++;
}
if(bfs()) ans=min(ans,lst+dis[n]);
if(j==m) break;
Qp(e[j+1].z-lst);
lst=e[j+1].z;
}
// for(i=1;i<=n;i++) {for(j=1;j<=n;j++) printf("%d ",RE.v[i][j]==1);puts("");}
if(ans==1<<30) puts("Impossible");
else printf("%d\n",ans);
}
/*
3 2
1 2 0
2 3 1 3 3
2 1 0
2 3 6
1 2 0
*/
CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset+bfs的更多相关文章
- bzoj 2165: 大楼【Floyd+矩阵乘法+倍增+贪心】
1<<i的结果需要是long long的话i是long long是没用的--要写成1ll<<i--我别是个傻子吧 虽然写的是二进制贪心,但是我觉得二分可能更好写吧(但是会慢) ...
- BZOJ4386[POI2015]Wycieczki——矩阵乘法+倍增
题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入 第 ...
- Codeforces 576D. Flights for Regular Customers(倍增floyd+bitset)
这破题调了我一天...错了一大堆细节T T 首先显然可以将边权先排序,然后逐个加进图中. 加进图后,倍增跑跑看能不能到达n,不能的话加新的边继续跑. 倍增的时候要预处理出h[i]表示转移矩阵的2^0~ ...
- CF576D Flights for Regular Customers 矩阵乘法 + Bitset优化
%%%cxhscst2's blog Codeforces 576D Flights for Regular Customers(矩阵加速DP) 代码非常优美 + 简洁,学习到了 Code: #inc ...
- poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)
Cow Relays Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7825 Accepted: 3068 Descri ...
- POJ3613 Cow Relays [矩阵乘法 floyd类似]
Cow Relays Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7335 Accepted: 2878 Descri ...
- CF781D Axel and Marston in Bitland [倍增 矩阵乘法 bitset]
Axel and Marston in Bitland 好开心第一次补$F$题虽然是$Div.2$ 题意: 一个有向图,每条边是$0$或$1$,要求按如下规则构造一个序列然后走: 第一个是$0$,每次 ...
- BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)
题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...
- 【Floyd矩阵乘法】BZOJ1706- [usaco2007 Nov]relays 奶牛接力跑
[题目大意] 给出一张无向图,求出恰巧经过n条边的最短路. [思路] 首先题目中只有100条边,却给出了10000个点(实际上最多只能有200个),离散化一下. 后面就是Floyd的新姿势,以前看过的 ...
随机推荐
- css3 改变默认选中文本背景色和文本颜色
::selection { background:#d3d3d3; color:#555; } ::-moz-selection { background:#d3d3d3; color:#555; } ...
- ORA-01033: ORACLE initialization or shutdown in progress问题
这是Oracle12c中笔者遇到的一个错误提示:ORA-01033: ORACLE initialization or shutdown in progress 错误的中文意思是:Oracle初始化未 ...
- Map类的三种实现 <个人练习>
package cn.zmh.zuoye; import java.util.HashMap; import java.util.Iterator; import java.util.Map; imp ...
- 使用datatables实现列宽设置、水平滚动条、显示某列部分内容
示例 1.//使用 columnDefs 给列设置宽度 $('#example').DataTable( { "columnDefs": [ //给第一列指定宽度为表格整个宽度的2 ...
- python的websocket实现Tornado
1.使用flask的扩展: pip install flask-socketio 2.Tornado提供较好的ws(websocket)支持 参考:1.http://www.jianshu.com/p ...
- 玩转Bash脚本:循环结构之while循环(转)
转自:http://blog.csdn.net/guodongxiaren/article/details/43341769 总第8篇 本系列(玩转Bash脚本)更多文章,请访问:http://b ...
- 源代码方式向openssl中加入新算法完整具体步骤(演示样例:摘要算法SM3)【非engine方式】
openssl简单介绍 openssl是一个功能丰富且自包括的开源安全工具箱.它提供的主要功能有:SSL协议实现(包括SSLv2.SSLv3和TLSv1).大量软算法(对称/非对称/摘要).大数运算. ...
- k进制正整数的对k-1取余与按位取余
华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/8/24 先说一下结论 有k进制数abcd,有abcd%(k−1)=(a+b+c+d)%(k−1) 这是由于kn=((k−1)+1)n=∑ ...
- SpringBoot学习之启动报错【This application has no explicit mapping for /error.....】
今天做SpringBoot小例子,在请求controller层的时候出现如下问题. Whitelabel Error Page This application has no explicit map ...
- 【转载】C#扫盲之:==/Equals /ReferenceEquals 异同的总结,相等性你真的知道吗?
1.前言 == Equals ReferenceEquals 三个相等性测试,是.NET提供给程序员使用的三个方法,他们之间有什么联系和区别,你真的仔细研究过?虽然之前也多多少少知道一点,但是有时候又 ...