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 < ...
随机推荐
- 【Git学习笔记】用git pull取回远程仓库某个分支的更新,再与本地的指定分支自动merge【转】
本文转载自:http://blog.csdn.net/liuchunming033/article/details/45367629 git pull的作用是,从远程库中获取某个分支的更新,再与本地指 ...
- Android+Jquery Mobile学习系列(7)-保险人信息
[保险人管理]是这个APP最重要的功能,用于保存保险客户的数据,给后面的功能提供数据支撑. 简单说说[保险人管理]功能:主要就是增.删.改.查四个功能,在新增和修改的时候不仅可以保存保险人的姓名.身份 ...
- B1232 [Usaco2008Nov]安慰奶牛cheer 最小生成树
%%%小詹太巨啦!!!我就想直接最小生成树之后建树跑dfs,然后写跪了...然后看小詹博客之后恍然大悟,原来直接把边权改为w * 2 + 两边点权值就行了. 但是还是不对,为什么呢?原来我们起点走了三 ...
- tarjan用法——割点
今天洛谷疯狂给我推送tarjan的题(它好像发现了我最近学tarjan),我正好做一做试一试(顺便练一练快读和宏定义). 其实找割点的tarjan和算强连通分量的tarjan不一样,找割点的判定条件比 ...
- IJ-Error:常见错误
ylbtech-IJ-Error:常见错误 1.返回顶部 1. This application has no explicit mapping for /error, so you are seei ...
- Windows:Word,PPT,EXCEL com+组件配置
本文所涉及到配置前提: 服务器必须安装Office套件(Word,PPT,Excel) 第一部分 Word Com+组件权限配置 1.cmd模式输入dcomcnfg 2.找到Microsoft Wor ...
- [转]rdlc报表中表达式的使用--switch和IIF范例
本文转自:http://hi.baidu.com/oypx1234/item/5b35dec4e03a3ad697445266 =Switch( Fields!MLWHLO.Value = " ...
- 在窗体中把DataGridView中的数据导出Excel
//DataGridView导出Excel private void bt_Excl_Click(object sender, EventArgs e) { SaveFileDialog saveFi ...
- VS2012快捷操作功能
VS2003用了6年,感情深厚,最近换工作刚刚接触VS2010,使用一个月感觉VS2010在人性化方面的功能实在是太强悍了,大大提高了写代码的效率,就如同魔兽世界里的快捷键操作一样,左手抚键右手摸鼠, ...
- 配置 Sybase数据源
1.Start-- > All Programs -- > Sybase - -> Connectivity --> click ‘Open Client Directory ...