题目链接

先离散化,假设有\(P\)个点

定义矩阵\(A_{ij}\)表示\(i\)到\(j\)只经过一条边的最短路,$${(A^{a+b}){ij}=\min{1\le k\le p} { (Aa)_{ik}+(Ab)_{kj} }}$$

\(A^{a+b}_{ij}\)表示\(i\)到\(j\)经过\((a+b)\)条边的最短路。

这不就是\(ddp\)里常用的广义矩阵乘法吗,直接上快速幂即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int b[1010], n, m, s, t, cnt, A, B, C;
struct Matrix{
int a[220][220];
}M;
Matrix operator * (Matrix a, Matrix b){
Matrix c;
for(int i = 1; i <= cnt; ++i)
for(int j = 1; j <= cnt; ++j){
c.a[i][j] = 1 << 29;
for(int k = 1; k <= cnt; ++k)
c.a[i][j] = min(c.a[i][j], a.a[i][k] + b.a[k][j]);
}
return c;
}
int main(){
scanf("%d%d%d%d", &n, &m, &s, &t);
memset(M.a, 63, sizeof M.a);
for(int i = 1; i <= m; ++i){
scanf("%d%d%d", &C, &A, &B);
if(!b[A]) b[A] = ++cnt;
if(!b[B]) b[B] = ++cnt;
M.a[b[A]][b[B]] = M.a[b[B]][b[A]] = C;
}
Matrix now = M; --n;
while(n){
if(n & 1) now = now * M;
M = M * M; n >>= 1;
}
printf("%d\n", now.a[b[s]][b[t]]);
return 0;
}

最新文章

  1. Spring Mvc的入门
  2. 优雅的数组降维——Javascript中apply方法的妙用
  3. css知多少——选择器的优先级
  4. VS2015快捷键
  5. WPF样式
  6. 如何绑定android点击事件--跳转到另一个页面并实现关闭功能?
  7. 无限互联IOS电影项目视频笔记
  8. 转:Android设置全局变量
  9. 统计单词频率--map
  10. JQuery坑,说说哪些大家都踩过的坑
  11. DDD - 概述 - (一)
  12. PE知识复习之PE新增节
  13. __attribute__ 机制详解(一)
  14. mycql 多表联合查询
  15. 让你提升命令行效率的 Bash 快捷键 [完整版]
  16. linux配置IP访问权限
  17. Ubuntu 安装 matplotlib
  18. Ubuntu16.04换源(转)
  19. docker push images login -u harbor 问题记录 https 证书
  20. 国外某牛人的JsonModelBinder 实现 MVC 3.0

热门文章

  1. 懵了!简单的HTTP调用,时延竟如此大?
  2. jar第三方组件Dependency-check依赖检查工具
  3. android -------- Base64 加密解密算法
  4. 010 @ControllerAdvice
  5. disruptor 组件理解
  6. ISO/IEC 9899:2011 摘要
  7. 用Python实现的Internet电话软件(P2P-SIP)&lt;开源&gt;
  8. 分类的性能评估:准确率、精确率、Recall召回率、F1、F2
  9. preg_quote
  10. 【python基础】argparse模块