POJ - 3613 Cow Relays(Floyd思想+矩阵快速幂+动态规划)
题目链接:点击查看
题目大意:给定一张由T(T<=100)条边构成的无向图,点的编号为1~1000,之间的整数,求从起点S到终点E恰好经过N(N<=1e6)条边(可重复经过)的最短路
题目分析:虽然点的编号在1e3以内,却只有100条边,我们可以离散化,这样最多只需要一个200*200的邻接矩阵就可以维护了,离散化后我们考虑maze储存了邻接矩阵,则dp[i][j]=min(maze[i][k]+maze[k][j]),dp[i][j]表示的是点i和点j经过了一条边的最短路,这样我们可以将整个数组上升至三维空间,dp[k][i][j]代表的是点i到点j经过了k个点后的最短路,转移方程为:
dp[k][i][j]=min(dp[x][i][t]+dp[k-x][t][j]) (t为连接点i和点j的中间点)
这样一来就可以用矩阵快速幂优化了,只不过需要将矩阵乘法改成取加法运算,矩阵加法改成取min运算,每次都由第k-1层转移到第k层,最后答案就是dp[k][st][ed]了,因为每次的空间都可以滚动使用,所以第一维的k并不需要真实体现出来,这只是一种思维的体现,实际实现的过程中完全可以省略掉
最后注意一下每条边的输入格式是w u v,太恶心人了吧?调了一个小时
代码:
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=210;struct Edge
{int u,v,w;void input(){scanf("%d%d%d",&w,&u,&v);//注意输入格式}
}edge[N];int n;vector<int>v;//离散化用 int get_id(int x)//获得离散化后的映射
{return lower_bound(v.begin(),v.end(),x)-v.begin();
}struct Ma
{int a[N][N];Ma(){memset(a,inf,sizeof(a));}friend Ma operator*(const Ma& a,const Ma& b){Ma ans;for(int i=0;i<v.size();i++)for(int j=0;j<v.size();j++){ans.a[i][j]=inf;for(int k=0;k<v.size();k++)ans.a[i][j]=min(ans.a[i][j],a.a[i][k]+b.a[k][j]);}return ans;}
};Ma q_pow(Ma a,int b)
{Ma ans=a;while(b){if(b&1)ans=ans*a;a=a*a;b>>=1;}return ans;
}int main()
{
// freopen("input.txt","r",stdin);
// ios::sync_with_stdio(false);int k,n,st,ed;scanf("%d%d%d%d",&k,&n,&st,&ed);Ma ans;for(int i=1;i<=n;i++){edge[i].input();v.push_back(edge[i].u);v.push_back(edge[i].v);}sort(v.begin(),v.end());v.erase(unique(v.begin(),v.end()),v.end());for(int i=1;i<=n;i++){int x=get_id(edge[i].u);int y=get_id(edge[i].v);int w=edge[i].w;ans.a[x][y]=ans.a[y][x]=w;}ans=q_pow(ans,k-1);printf("%d\n",ans.a[get_id(st)][get_id(ed)]);return 0;
}
POJ - 3613 Cow Relays(Floyd思想+矩阵快速幂+动态规划)相关推荐
- 矩阵快速幂+动态规划=蓝桥杯 垒骰子
矩阵快速幂+动态规划=蓝桥杯 垒骰子 如果还不知道什么是矩阵快速幂,可以参加我的另一篇文章:矩阵快速幂详解 题目 分析 看到 nnn 的范围达到了 10910^{9}109 ,如果使用暴力搜索是不现实 ...
- POJ 2778 DNA Sequence [AC自动机 + 矩阵快速幂]
http://poj.org/problem?id=2778 题意:给一些只由ACGT组成的模式串,问有多少种长度为n且不含有给出的模式串的DNA序列. 自动机的状态转换可以看成一个有向图(有重边的) ...
- POJ - 2778 DNA Sequence(AC自动机+矩阵快速幂)
题目链接:点击查看 题目大意:给出 n 个长度不大于 10 的字符串表示病毒串,再给出一个长度 len ,问长度为 len 的字符串中,有多少个字符串不含有病毒串作为子串 题目分析:因为病毒串的长度和 ...
- POJ 3233 Matrix Power Serie (矩阵快速幂)
Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + - + Ak. ...
- POJ 3613 Cow Relays (floyd + 矩阵高速幂)
题目大意: 求刚好经过K条路的最短路 我们知道假设一个矩阵A[i][j] 表示表示 i-j 是否可达 那么 A*A=B B[i][j] 就表示 i-j 刚好走过两条路的方法数 那么同理 我们把 ...
- I-Matrix Power Series POJ - 3233 矩阵快速幂+分治
I-Matrix Power Series POJ - 3233 矩阵快速幂+分治 Problem Description Given a n × n matrix A and a positive ...
- H - Fibonacci POJ - 3070 (矩阵快速幂)
H - Fibonacci POJ - 3070 (矩阵快速幂) Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and ...
- POJ 3070 Fibonacci(矩阵快速幂入门、模板)
? 题目链接:http://poj.org/problem?id=3070 ? 这题就是让求斐波那契数列的第n项,但是题目中n很大,所以打表和直接求都会TLE,对于这个题我们可以用矩阵快速幂,下面 ...
- BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)
题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...
最新文章
- 比较两个二维数组是否相等
- DTC精彩回顾—王义成:国产数据库技术发展的探索与思考
- Oryx 2.1.2版本: src源码编译
- 用决策树模型求解回归问题(regression tree)
- MySQL数据库(10)----IN 和 NOT IN 子查询
- 在禁用视图状态的情况下仍然使用ViewState对象
- [转载]《博客园精华集》WebService筛选结果(共79篇)
- Java语言中的泛型
- 修改JDK的经历:两处字体的粗体代码引起的错误
- android+ios打印机,Android/iOS手机安装HP打印机的详细方法和操作步骤
- layabox 打印_Layabox 集成指南
- 关于能力模型的思考总结
- 明尼苏达大学双城分校计算机科学,UMN的CS「明尼苏达大学双城分校计算机科学与工程系」...
- 如何搞定 K8S 微服务自动化发布系统
- 数据库MySQL入门-下
- 下载B(bilibili)站视频
- 如何在Windows 7中将管理工具添加到开始菜单
- ACM基本算法类题目
- 程序员自我修养——提问的智慧
- 看完 2022 雷军年度演讲,我总结了我的故事