这破题调了我一天...错了一大堆细节T T

  首先显然可以将边权先排序,然后逐个加进图中。

  加进图后,倍增跑跑看能不能到达n,不能的话加新的边继续跑。

  倍增的时候要预处理出h[i]表示转移矩阵的2^0~i的或和,转移是h[i]=h[i-1]*h[i-1]。

  注意两个矩阵包含0~i和0~j相乘的时候,得到的矩阵是0~i*j的,而两个矩阵包含0~i和0~j或起来的时候,得到的矩阵是j~i+j的。

  倍增的时候因为必须答案单调,所以当前的值必须或上之前的值。

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<bitset>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=, inf=1e9+;
struct mtx{bitset<maxn>mp[maxn]; mtx(){for(int i=;i<maxn;i++) mp[i].reset();}}tmp, tmp2, f, base, h[];
struct poi{int x, y, dis;}a[maxn];
int n, m;
mtx operator *(mtx a, mtx b)
{
mtx c;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(a.mp[i][j]) c.mp[i]|=b.mp[j];
return c;
}
mtx operator |(mtx a, mtx b)
{
mtx c;
for(int i=;i<=n;i++)
c.mp[i]|=a.mp[i]|b.mp[i];
return c;
}
inline void power(int b)
{
if(b<=) return;
for(;b;b>>=, tmp=tmp*tmp)
if(b&) f=f*tmp;
}
inline bool cmp(poi a, poi b){return a.dis<b.dis;}
int main()
{
scanf("%d%d", &n, &m);
for(int i=;i<=m;i++) scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].dis);
sort(a+, a++m, cmp); a[m+].dis=inf;
if(a[].dis) return puts("Impossible"), ;
for(int i=;i<=n;i++) f.mp[i][i]=;
for(int i=;i<=m;i++)
{
tmp=base; power(a[i].dis-a[i-].dis);
base.mp[a[i].x][a[i].y]=;
int up=log2(a[i+].dis-a[i].dis);
h[]=base; for(int j=;j<=n;j++) h[].mp[j][j]=h[].mp[j][j]|;
mtx tmpx; for(int j=;j<=n;j++) tmpx.mp[j][j]=;
if(a[i+].dis-a[i].dis & ) tmpx=tmpx|(tmpx*h[]);
for(int j=;j<=up;j++)
{
h[j]=h[j-]*h[j-];
if(a[i+].dis-a[i].dis & (<<j)) tmpx=tmpx|(tmpx*h[j]);
}
tmpx=f*tmpx;
if(!tmpx.mp[][n]) continue;
mtx tmp1=f; int ans=;
for(int j=up;j>=;j--)
if(a[i].dis+ans+(<<j)<=a[i+].dis)
{
tmp2=tmp1; tmp2=tmp2*h[j];
if(tmp2.mp[][n]) continue;
ans+=(<<j); tmp1=tmp2;
}
return printf("%d\n", a[i].dis+ans+), ;
}
puts("Impossible");
}

最新文章

  1. Java 基础之-枚举
  2. HDU 1402 fft 模板题
  3. 银行ATM机工作流程模拟编程(代码)
  4. Sql Server查询性能优化之走出索引的误区
  5. openstack 整合
  6. 动态规划——F 最大矩阵和
  7. Ch06 验证
  8. JAVA基础--单例模式
  9. selenium+python 自动化中界面滚动条操作方法
  10. Java ASM介绍
  11. Salesforce知识整理(一)之Lightning Web Component Tools
  12. 推荐 | Vue 入门&amp;进阶路线
  13. Flask初识
  14. spring boot+spring data jpa+gradle+mysql配置问题
  15. 史上最简单的SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)
  16. Android开发中常见的设计模式(四)——策略模式
  17. 在Ubuntu环境下安装eclipse
  18. Nand Flash 驱动框架
  19. springboot 入门
  20. go语言之进阶篇方法的重写

热门文章

  1. 为CentOS系统配置防火墙设置
  2. 发送请求工具—Advanced REST Client的安装使用
  3. GitHub 多人协作开发 三种方式:
  4. RESTful源码笔记之RESTful Framework的基本组件
  5. 关于jsonp跨域的 实现
  6. P4语法(4)Control block
  7. 常用IDE插件
  8. lintcode-423-有效的括号序列
  9. C++ Primer Plus学习:第八章
  10. 写在SVM之前——凸优化与对偶问题