题目大概要求从起点到终点恰好经过k条边的最短路。

离散数学告诉我们邻接矩阵的k次幂就能得出恰好经过k条路的信息,比如POJ2778

这题也一样,矩阵的幂运算定义成min,而min满足结合律,所以可以用快速幂求解。

另外这题点的序号要离散化一下,最多也就200个点。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF (1<<29) int N; struct Mat{
int m[][];
Mat(){
for(int i=; i<; ++i){
for(int j=; j<; ++j) m[i][j]=INF;
}
}
};
Mat operator*(const Mat &m1,const Mat &m2){
Mat m;
for(int i=; i<N; ++i){
for(int j=; j<N; ++j){
for(int k=; k<N; ++k){
m.m[i][j]=min(m.m[i][j],m1.m[i][k]+m2.m[k][j]);
}
}
}
return m;
}; int idx[]; int main(){
Mat m;
int n,t,s,e,a,b,c;
scanf("%d%d%d%d",&n,&t,&s,&e);
memset(idx,-,sizeof(idx));
while(t--){
scanf("%d%d%d",&c,&a,&b);
if(idx[a]==-){
idx[a]=N++;
}
if(idx[b]==-){
idx[b]=N++;
}
m.m[idx[a]][idx[b]]=m.m[idx[b]][idx[a]]=c;
}
--n;
Mat ans=m;
while(n){
if(n&){
ans=ans*m;
}
m=m*m;
n>>=;
}
printf("%d",ans.m[idx[s]][idx[e]]);
return ;
}

最新文章

  1. html radio check
  2. cocopods 安装与使用
  3. 自己做了一个json格式化工具,亲测可以使用
  4. Mysql 分区
  5. python数据结构与算法——图的最短路径(Floyd-Warshall算法)
  6. itellyou MSDN, 我告诉你 win7系统工具等
  7. html 头部正常用法
  8. 5.npm scripts 使用指南
  9. Hive分区表动态添加字段
  10. 用JavaScript写一个简单的计算器
  11. 2019/2/11 LinuxRPM包管理
  12. Mybatis之插件拦截
  13. javascript中的LHS和RHS
  14. word宏(macro) 之 注意事项,常见语法和学习地方
  15. 取得 Ajax 返回参数
  16. 20155212 2016-2017-2 《Java程序设计》第3周学习总结
  17. OAuth:OAuth概述
  18. Python学习 day06
  19. Ajax基础介绍
  20. 【WPF】这可能是全网最全的拖拽实现方法的总结

热门文章

  1. Mysql undo与redo Log
  2. mybatis 学习!
  3. 通过mysql命令行理解mysql
  4. AngularJS讲义-控制器
  5. 6-02使用SQL语句向表中插入数据
  6. ASP.NET 5探险(4):如何把ASP.NET 5从beta4升级到beta5
  7. [CentOS]安装软件:/lib/ld-linux.so.2: bad ELF interpreter解决
  8. JVM内存结构、垃圾回收那点事
  9. 实现Activity刷新 (转)
  10. IIS配置php运行环境默认加载的php.ini路径