foj 2173 floyd+矩阵快速幂
Problem 2173 NostopAccept: 52 Submit: 210
Time Limit: 3000 mSec Memory Limit : 32768 KB
Problem Description
M国有N个城市,H条单向的道路,AekdyCoin从编号为1的城市出发,每经过一条道路要花一个单位的时间。假设他出发的时刻为0,他需要在K时刻到达编号为N的城市。并且,AekdyCoin不会在一个城市停留,每到一个城市他要立刻往下一个城市出发,最后在K时刻时他必须在城市N。虽然AekdyCoin经过任意一条道路的花费的时间都是1,但是每条道路的过路费不一定相同。现给出每条道路的过路费,问AekdyCoin从编号为1的城市出发,在K时刻到达编号为N的城市最小需要花费多少钱?注意AekdyCoin可以经过同一个城市任意多次,包括城市N。
Input
第一行输入一个整数T表示数据组数,接下来输入T组数据。对于每组数据,第一行输入三个整数N,H,K(1<=N<=50,1<=H<=3000,1<=K<=1000000000),接下来输入H行,每行三个整数u、v、cost(1<=u,v<=n,1<=cost<=1000000),表示从u到v过路费为cost的一条单行道。
Output
对于每组数据输出一行一个整数表示最小花费,若无法在K时刻到达城市N,则输出-1。
Sample Input
Sample Output
FOJ 2173 Nostop 从1点到n点恰好走了k次的最短路
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2173
思路:
类似于传递闭包的性质
用矩阵mp[i][j] 表示i点到j点 走1次的最短路
--------------
若我们用 mp[i][j] 表示从i点到j点 走了k次的最短路距离
那么我们要通过 矩阵mp 得到 矩阵 ret[u][v] 表示 u->v 走了2*k次的最短路
就是:
mp[u][i] + mp[i][v]; i为任意点(即1-n)
显然我们转换一下上式就是:
ret[u][v] = inf;
for(int i = 1; i <= n; i++)
ret[u][v] = min(ret[u][v], mp[u][i]+mp[i][v]);
然后求出整个的ret矩阵就是:
for(int u = 1; u<=n; u++)
for(int v = 1; v<=n; v++){
ret[u][v] = inf;
for(int i = 1; i <= n; i++)
ret[u][v] = min(ret[u][v], mp[u][i]+mp[i][v]);
}
显然就是 ret = mp*mp;
然后套个矩阵快速幂:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
#define Matr 55 //矩阵大小,注意能小就小
#define ll long long #define N 52
#define inf 100000000000000000
struct mat{//矩阵结构体,a表示内容,size大小 矩阵从1开始
ll a[Matr][Matr];
int size;
};
mat multi(mat m1,mat m2)//两个相等矩阵的乘法,对于稀疏矩阵,有0处不用运算的优化
{
mat ans;ans.size=m1.size;
for(int i=1;i<=m1.size;i++)
for(int j=1;j<=m2.size;j++)
{
ll tmp = inf;
for(int k = 1; k <= m1.size; k++)
tmp = min(tmp, m1.a[i][k] + m2.a[k][j]);
ans.a[i][j]=tmp;
}
return ans;
}
mat quickmulti(mat m,int n){
mat ans=m;
n--;
while(n){
if(n&1)ans=multi(m,ans);
m=multi(m,m);
n>>=1;
}
return ans;
}
mat mp;
int n, m, k; int main(){
int u, v, i, j, T; scanf("%d",&T);
ll d;
while(T--){
scanf("%d %d %d",&n,&m,&k);
for(i=1;i<=n;i++)for(j=1;j<=n;j++)mp.a[i][j] = inf;
mp.size = n;
while(m--){
scanf("%d %d",&u,&v); cin>>d;
mp.a[u][v] = min(mp.a[u][v], d);
}
mat ans = quickmulti(mp,k);
if(ans.a[1][n]==inf)puts("-1");
else cout<<ans.a[1][n]<<endl;
}
return 0;
}
foj 2173 floyd+矩阵快速幂的更多相关文章
- fzu 2173 floyd+矩阵快速幂
#include<stdio.h> #define inf 1000000000000000 #define N 100 long long tmp[N][N],ma[N][N]; int ...
- poj 3613 经过k条边最短路 floyd+矩阵快速幂
http://poj.org/problem?id=3613 s->t上经过k条边的最短路 先把1000范围的点离散化到200中,然后使用最短路可以使用floyd,由于求的是经过k条路的最短路, ...
- [POJ3613] Cow Relays(Floyd+矩阵快速幂)
解题报告 感觉这道题gyz大佬以前好像讲过一道差不多的?然鹅我这个蒟蒻发现矩阵快速幂已经全被我还给老师了...又恶补了一遍,真是恶臭啊. 题意 给定一个T(2 <= T <= 100)条边 ...
- POJ 3631 Cow Relays Floyd+矩阵快速幂
题目描述 For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race ...
- POJ 3613 floyd+矩阵快速幂
题意: 求s到e恰好经过n边的最短路 思路: 这题已经被我放了好长时间了. 原来是不会矩阵乘法,快速幂什么的也一知半解 现在终于稍微明白了点了 其实就是把矩阵乘法稍微改改 改成能够满足结合律的矩阵&q ...
- poj3613Cow Relays——k边最短路(矩阵快速幂)
题目:http://poj.org/problem?id=3613 题意就是求从起点到终点的一条恰好经过k条边的最短路: floyd+矩阵快速幂,矩阵中的第i行第j列表示从i到j的最短路,矩阵本身代表 ...
- BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)
题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...
- poj 3613 Cow Relays【矩阵快速幂+Floyd】
!:自环也算一条路径 矩阵快速幂,把矩阵乘法的部分替换成Floyd(只用一个点扩张),这样每"乘"一次,就是经过增加一条边的最短路,用矩阵快速幂优化,然后因为边数是100级别的,所 ...
- [bzoj1706]奶牛接力跑 题解 (矩阵快速幂(或者叫倍增Floyd?))
Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T < ...
随机推荐
- splay树入门(带3个例题)
splay树入门(带3个例题) 首先声明,本教程的对象是完全没有接触过splay的OIer,大牛请右上角.. PS:若代码有误,请尽快与本人联系,我会尽快改正 首先引入一下splay的概念,他的中文名 ...
- tensorflow 模型压缩
模型压缩 为了将tensorflow深度学习模型部署到移动/嵌入式设备上,我们应该致力于减少模型的内存占用,缩短推断时间,减少耗电.有几种方法可以实现这些要求,如量化.权重剪枝或将大模型提炼成小模型. ...
- UESTC--1251--谕神的密码(贪心)
谕神的密码 Time Limit: 1000MS Memory Limit: 65535KB 64bit IO Format: %lld & %llu Submit Status ...
- hdoj- Windows Message Queue
Windows Message Queue Problem Description Message queue is the basic fundamental of windows system. ...
- php 原生简版日志导出
<?phpfunction writeLog($msg){ $logFile = date('Y-m-d').'.txt'; $msg = date('Y-m-d H:i:s').' >& ...
- C#将文件压缩成一个文件流,供前端下载
直接上代码供大家参考... 前端页面就是一个下载的Button.. <body> <form id="form1" runat="server" ...
- Android HTTP下载文件并保存到本地或SD卡
想把文件保存到SD卡中,一定要知道SD卡的路径,获取SD卡路径: Environment.getExternalStorageDirectory() 另外,在保存之前要判断SD卡是否已经安装好,并且可 ...
- DNN:逻辑回归与 SoftMax 回归方法
UFLDL Tutorial 翻译系列:http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial 第四章:SoftMax回归 简介: ...
- SLAM:使用G2O-ORB-SLAM(编译)
前言: 没有新雪,看看自己所做的事情,有没有前人做过.果然,EKF_SLAM的版本出现了Android版本的OpenEKFMonoSLAM, G2O-ORB SLAM也出现了VS2012版本. 一.S ...
- Eigen与Matlab语法及语义辞典
Eigen为Matlab转换为C++提供了一个简单的语法级别的代码迁移工具. 对一些代码进行了扩充,以便程序由Matlab到Eigen的移植................... 参考链接:http: ...