题目大意

  求在一张有\(m\)条边无向连通图中,点\(s\)到点\(t\)的经过\(k\)条边的最短路(\(1 \leq m \leq 100\),\(1 \leq k \leq 10^6\))。

题解

  边数\(m\)很小,显然点数\(n\)也很小,不超过\(200\),我们可以先离散化处理。

  我们可以得到\(n\)个点之间的邻接矩阵,其中矩阵中的\(a[i][j]\)就相当于点\(i\)到点\(j\)的经过\(1\)条边的最短路

  此时我们设\(dp[i][j][k']\)表示点\(i\)到点\(j\)的经过\(k'\)条边的最短路,显然有

\[dp[i][j][1] = a[i][j]
\]

  且

\[dp[i][j][k'] = \min \{ dp[i][l][k' - 1]+ dp[l][j][k' - 1] \}, k' > 1
\]

  显然,朴素的dp复杂度为\(O(kn^2)\)。

  观察这个过程,其实很像矩阵乘法,同样的,我们也可以用矩阵快速幂来优化,这样复杂度就降到$O(n^2 \log{k}) $了。

#include <iostream>
#include <cstring>
#include <algorithm> #define MAX_M (100 + 5) using namespace std; int K, m, s, t;
int u[MAX_M], v[MAX_M];
long long w[MAX_M];
int tmp[MAX_M << 1];
int to[1000005], n; struct Matrix
{
long long mat[MAX_M][MAX_M]; Matrix()
{
memset(mat, 0x3f, sizeof mat);
return;
} friend Matrix operator * (Matrix a, Matrix b)
{
Matrix c;
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
{
for(int k = 1; k <= n; ++k)
{
c.mat[i][j] = min(c.mat[i][j], a.mat[i][k] + b.mat[k][j]);
}
}
}
return c;
} friend Matrix operator *= (Matrix & a, Matrix b)
{
return a = a * b;
}
}; Matrix a; int main()
{
cin >> K >> m >> s >> t;
for(int i = 1; i <= m; ++i)
{
cin >> w[i] >> u[i] >> v[i];
tmp[i << 1 ^ 1] = u[i];
tmp[i << 1] = v[i];
}
sort(tmp + 1, tmp + m + m + 1);
for(int i = 1; i <= (m << 1); ++i)
{
if(tmp[i] != tmp[i - 1]) to[tmp[i]] = ++n;
}
for(int i = 1; i <= m; ++i)
{
u[i] = to[u[i]];
v[i] = to[v[i]];
a.mat[u[i]][v[i]] = min(a.mat[u[i]][v[i]], w[i]);
a.mat[v[i]][u[i]] = min(a.mat[v[i]][u[i]], w[i]);
}
--K;
Matrix res = a;
while(K)
{
if(K & 1) res *= a;
a *= a;
K >>= 1;
}
cout << res.mat[to[s]][to[t]];
return 0;
}

最新文章

  1. 我的Time
  2. CodeBlocks ubuntu常见问题及小技巧
  3. 标准类型内建函数 cmp()介绍
  4. BSON与JSON的区别
  5. socket本地模拟UDP 服务器+客户端(三)
  6. c/c++实现混合编程
  7. Python高手之路【十】python基础之反射
  8. 集合问题 离线+并查集 HDU 3938
  9. java基础之路(二)上
  10. QUICK-AP + BETTERCAP 替换局域网内其他用户的下载文件为自定义文件
  11. js 切换全屏
  12. JavaScript中的三种弹出对话框
  13. visual studio 配置属性中增加自定义宏和宏值
  14. 本文转自 MyEclipse 2015反编译插件安装
  15. mysql sql注入getshell新姿势
  16. 关于C#中break和continue的认识
  17. Centos7 安装nginx1.14
  18. 【 nginx 】怎么安装nginx
  19. Linux性能测试分析命令_iostat
  20. JAVA自学日记——Part Ⅱ

热门文章

  1. kettle crontab java: command not found
  2. USB-TTL
  3. &lt;el-menu&gt;菜单标签(里面可以包括:&lt;el-submenu&gt;和&lt;el-menu-item&gt;)
  4. 调整数组顺序使奇数位于偶数前面(python)
  5. SQL Server2008收缩日志文件
  6. ExoPlayer + 边缓存边播放
  7. mysql配置参数设置和进程管理
  8. three arrays
  9. 模拟vue实现简单的webpack打包
  10. 深入理解JVM虚拟机1:JVM内存的结构与消失的永久代