Problem 2173 Nostop

Accept: 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

15 5 31 2 12 5 11 3 103 4 104 5 10

 Sample Output

30

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+矩阵快速幂的更多相关文章

  1. fzu 2173 floyd+矩阵快速幂

    #include<stdio.h> #define inf 1000000000000000 #define N 100 long long tmp[N][N],ma[N][N]; int ...

  2. poj 3613 经过k条边最短路 floyd+矩阵快速幂

    http://poj.org/problem?id=3613 s->t上经过k条边的最短路 先把1000范围的点离散化到200中,然后使用最短路可以使用floyd,由于求的是经过k条路的最短路, ...

  3. [POJ3613] Cow Relays(Floyd+矩阵快速幂)

    解题报告 感觉这道题gyz大佬以前好像讲过一道差不多的?然鹅我这个蒟蒻发现矩阵快速幂已经全被我还给老师了...又恶补了一遍,真是恶臭啊. 题意 给定一个T(2 <= T <= 100)条边 ...

  4. POJ 3631 Cow Relays Floyd+矩阵快速幂

    题目描述 For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race ...

  5. POJ 3613 floyd+矩阵快速幂

    题意: 求s到e恰好经过n边的最短路 思路: 这题已经被我放了好长时间了. 原来是不会矩阵乘法,快速幂什么的也一知半解 现在终于稍微明白了点了 其实就是把矩阵乘法稍微改改 改成能够满足结合律的矩阵&q ...

  6. poj3613Cow Relays——k边最短路(矩阵快速幂)

    题目:http://poj.org/problem?id=3613 题意就是求从起点到终点的一条恰好经过k条边的最短路: floyd+矩阵快速幂,矩阵中的第i行第j列表示从i到j的最短路,矩阵本身代表 ...

  7. BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)

    题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...

  8. poj 3613 Cow Relays【矩阵快速幂+Floyd】

    !:自环也算一条路径 矩阵快速幂,把矩阵乘法的部分替换成Floyd(只用一个点扩张),这样每"乘"一次,就是经过增加一条边的最短路,用矩阵快速幂优化,然后因为边数是100级别的,所 ...

  9. [bzoj1706]奶牛接力跑 题解 (矩阵快速幂(或者叫倍增Floyd?))

    Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T < ...

随机推荐

  1. 0420-mysql关键词/错误提示关键词

    操作关键词: 1.show //查看.展示 2.use //选择(库/表) 3.database/s //库/所有库 4.table/s //表/所有表 5.primary key //主键:不可重复 ...

  2. codevs2800送外卖(floyd+状压dp)

    2800 送外卖  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond     题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东 ...

  3. Python 30 单例模式

    单例模式 多次实例化的结果指向同一个实例 单例模式实现方式 import settings #方式一: class MySQL: __instance=None def __init__(self,i ...

  4. D - Garden

    Problem description Luba thinks about watering her garden. The garden can be represented as a segmen ...

  5. springmvc 中将MultipartFile转为file,springboot 注入CommonsMultipartResolver

    第一种方法: MultipartFile file = xxx; CommonsMultipartFile cf= (CommonsMultipartFile)file; DiskFileItem f ...

  6. HTTPS的中那些加密算法

    密码学在计算机科学中使用非常广泛,HTTPS就是建立在密码学基础之上的一种安全的通信协议.HTTPS早在1994年由网景公司首次提出,而如今在众多互联网厂商的推广之下HTTPS已经被广泛使用在各种大小 ...

  7. android黑科技系列——防自动抢红包外挂原理解析

    一.前言 春节过年发个红包本来就是为了讨个喜庆,朋友亲戚之间的关系交流,但是现在随着技术变革,抢红包插件越来越多,导致现在不太愿意发红包了,特别是在一个多人群里,潜水的非常多,但是丢个红包瞬间就没了, ...

  8. 努比亚 Z17 mini s (Nubia NX589J) 解锁BootLoader 并刷入recovery ROOT

    首先下载好工具链接:链接:https://pan.baidu.com/s/1gher4T9 密码:rypn 备用下载链接:https://pan.baidu.com/s/1nxdzt9Z 本篇教程教你 ...

  9. 我的C++笔记(数据的共享与保护)

    *数据的共享与保护: * .作用域: * 作用域是一个标识符在程序正文中有效的区域.C++中标识符的作用域有函数原型作用域.局部作用域(块作用域).类作用域和命名空间作用域. * ().函数原型作用域 ...

  10. 微信小程序中的iPhone X适配问题

    微信小程序中的iPhone X适配问题 小程序中下方的导航会被iPhone X下面的那条黑线盖住[微笑脸],所以要专门为了iPhone X做样式上的适配[微笑脸] wx.getSystemInfo({ ...