最短路 + 矩阵快速幂

我们可以改进矩阵快速幂,使得它适合本题

用图的邻接矩阵和快速幂实现

注意 dis[i][i] 不能置为 0

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <cstring>
  6. #include <cstdlib>
  7. using namespace std;
  8. struct edge{
  9. int u, v, dis;
  10. }e[10000];
  11. int n, m, p, ss, tt;
  12. void work() {
  13. int sub[10005];
  14. for(int i = 1; i <= m; i++) {
  15. cin >> e[i].dis >> e[i].u >> e[i].v;
  16. sub[++n] = e[i].u;
  17. sub[++n] = e[i].v;
  18. }
  19. sort(sub + 1, sub + n + 1);
  20. n = unique(sub + 1, sub + n + 1) - sub - 1;
  21. for(int i = 1; i <= m; i++) {
  22. e[i].u = lower_bound(sub + 1, sub + n + 1, e[i].u) - sub;
  23. e[i].v = lower_bound(sub + 1, sub + n + 1, e[i].v) - sub;
  24. }
  25. ss = lower_bound(sub + 1, sub + n + 1, ss) - sub;
  26. tt = lower_bound(sub + 1, sub + n + 1, tt) - sub;
  27. }
  28. struct Matrix{
  29. int num[205][205];
  30. void clear() {
  31. memset(num, 0x3f, sizeof(num));
  32. }
  33. void unit() {
  34. memset(num, 0, sizeof(num));
  35. for(int i = 0; i < 205; i++) num[i][i] = 1;
  36. }
  37. Matrix operator * (const Matrix & b) {
  38. Matrix ans;
  39. ans.clear();
  40. for(int i = 1; i <= n; i++) {
  41. for(int j = 1; j <= n; j++) {
  42. for(int k = 1; k <= n; k++) {
  43. ans.num[i][j] = min(ans.num[i][j], num[i][k] + b.num[k][j]);
  44. }
  45. }
  46. }
  47. return ans;
  48. }
  49. void print() {
  50. for(int i = 1; i <= n; i++) {
  51. for(int j = 1; j <= n; j++) {
  52. printf("%d ", num[i][j]);
  53. }
  54. printf("\n");
  55. }
  56. }
  57. Matrix operator ^ (int k) {
  58. Matrix ans;
  59. k--;
  60. ans = (*this);
  61. while(k) {
  62. if(k & 1) ans = ans * (*this);
  63. (*this) = (*this) * (*this);
  64. k >>= 1;
  65. }
  66. return ans;
  67. }
  68. };
  69. int main() {
  70. cin >> p >> m >> ss >> tt;
  71. work();
  72. Matrix a;
  73. a.clear();
  74. //for(int i = 1; i <= n; i++) a.num[i][i] = 0;
  75. for(int i = 1; i <= m; i++) {
  76. a.num[e[i].u][e[i].v] = a.num[e[i].v][e[i].u] = min(e[i].dis, a.num[e[i].u][e[i].v]);
  77. }
  78. a = a ^ p;
  79. //a.print();
  80. printf("%d\n", a.num[ss][tt]);
  81. return 0;
  82. }

洛谷 [P2886] 牛继电器Cow Relays的更多相关文章

  1. [洛谷P2886] 牛继电器Cow Relays

    问题描述 For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race ...

  2. 洛谷P2886牛继电器

    传送门啦 倍增 $ Floyd $ 注意结构体里二维数组不能开到 $ 2000 $ #include <iostream> #include <cstdio> #include ...

  3. P2886 [USACO07NOV]牛继电器Cow Relays

    题目描述 For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race ...

  4. [USACO07NOV]牛继电器Cow Relays (最短路,DP)

    题目链接 Solution 非正解 似乎比较蛇啊,先个一个部分分做法,最短路+\(DP\). 在求最短路的堆或者队列中存储元素 \(dis_{i,j}\) 代表 \(i\) 这个节点,走了 \(j\) ...

  5. 洛谷P2886 [USACO07NOV]牛继电器Cow Relays

    题意很简单,给一张图,把基本的求起点到终点最短路改成求经过k条边的最短路. 求最短路常用的算法是dijkstra,SPFA,还有floyd. 考虑floyd的过程: c[i][j]=min(c[i][ ...

  6. 洛谷 P2886 [USACO07NOV]牛继电器Cow Relays

    题面 解题思路 ## floyd+矩阵快速幂,跟GhostCai爷打赌用不用离散化,最后完败..GhostCai真是tql ! 有个巧妙的方法就是将节点重新编号,因为与节点无关. 代码 #includ ...

  7. [LUOGU] P2886 [USACO07NOV]牛继电器Cow Relays

    https://www.luogu.org/problemnew/show/P2886 给定无向连通图,求经过k条边,s到t的最短路 Floyd形式的矩阵乘法,同样满足结合律,所以可以进行快速幂. 离 ...

  8. luogu题解 P2886 【牛继电器Cow Relays】-经过K边最短路&矩阵

    题目链接: https://www.luogu.org/problemnew/show/P2886 Update 6.16 最近看了下<算法导论>,惊奇地发现在在介绍\(APSP\) \( ...

  9. [USACO07NOV]牛继电器Cow Relays

    题目描述 给出一张无向连通图,求S到E经过k条边的最短路. 输入输出样例 输入样例#1: 2 6 6 4 11 4 6 4 4 8 8 4 9 6 6 8 2 6 9 3 8 9 输出样例#1: 10 ...

随机推荐

  1. linux - centos7 开放防火墙端口的新方式

    CentOS 升级到7之后,发现无法使用iptables控制Linuxs的端口, google之后发现Centos 7使用firewalld代替了原来的iptables. 下面记录如何使用firewa ...

  2. iOS中的数据存储方式_Plist

    plist文件只能存储OC常用数据类型(NSString.NSDictionary.NSArray.NSData.NSNumber等类型)而不能直接存储自定义模型对象; 我们拿NSData举例: /* ...

  3. k8s的资源限制及资源请求

    容器的资源需求及限制:  需求:requests   ##定义容器运行时至少需要资源  限制:limits     ##定义容器运行时最多能分配的资源    requests:pod.spec.con ...

  4. CUB reduce errorinvalid configuration argument

    解决CUB reduce errorinvalid configuration argument问题 在写TensorFlow代码时遇到报错 CUB reduce errorinvalid confi ...

  5. Python入门基本语法

      Python入门 以下主要讲述Python的一些基础语法,包含行的缩进在python中的重要意义,python中常见的保留字和引号的使用,如何实现单行注释和多行注释. print("he ...

  6. Applied Nonparametric Statistics-lec10

    Ref:https://onlinecourses.science.psu.edu/stat464/print/book/export/html/14 估计CDF The Empirical CDF ...

  7. 命令行执行Qt程序

    原文网址 //helloworld.cpp #include <QApplication> #include <QPushButton> int main(int argc,c ...

  8. nrf528xx bootloader 模块介绍(转载)

    转载https://www.cnblogs.com/rfnets/p/8205521.html 1. bootloader 的基本功能: 启动应用 几个应用之间切换 初始化外设 nordic nrf5 ...

  9. luogu2158 [SDOI2008]仪仗队 欧拉函数

    点 $ (i,j) $ 会看不见当有 $ k|i $ 且 $ k|j$ 时. 然后就成了求欧拉函数了. #include <iostream> #include <cstring&g ...

  10. 令人惊叹的sublime text 3 插件

    1.Chinese​Localization------语言汉化.(新手必备) 2.SublimeTmpl------打开生成模板.(新手必备) 3.SublimeCodeIntel------代码自 ...