Poj 3613 Cow Relays (图论)

题目大意

给出一个无向图,T条边,给出N,S,E,求S到E经过N条边的最短路径长度

理论上讲就是给了有n条边限制的最短路

solution

最一开始想到是的去直接统计最短路经过了多少条边,结果,,,

还是太年轻了。。。

不过,看数据范围只有1000,那么floyd是首选

回顾Floyd算法流程,其中的i到j松弛操作是通过k完成的

那么松弛一次就利用一个k点,我现在要经过n条边,那么松弛n次即可

详细说就是更新一次之后,把f[i][j]拷贝到原来的a[i][j]中,然后再松弛,此时i、j之间就已经松弛了两次了

以此类推,利用矩阵快速幂优化

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. // #define int long long
  6. using namespace std;
  7. inline int read(){
  8. int x = 0, w = 1;
  9. char ch = getchar();
  10. for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1;
  11. for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
  12. return x * w;
  13. }
  14. int s, t, n, e;
  15. int tot;
  16. const int maxn = 555;
  17. struct node{
  18. int a[maxn][maxn];
  19. node operator * (const node &x) const {
  20. node b;
  21. memset(b.a, 0x3f3f3f3f, sizeof b.a);
  22. for(int k = 1; k <= tot; k++)
  23. for(int i = 1; i <= tot ;i++)
  24. for(int j = 1; j <= tot ;j++)
  25. b.a[i][j] = min(b.a[i][j], a[i][k] + x.a[k][j]);
  26. return b;
  27. }
  28. }ans, dis;
  29. int num[1000086];
  30. signed main(){
  31. memset(dis.a, 0x3f3f3f3f, sizeof dis.a);
  32. n = read(), t = read(), s = read(), e = read();
  33. while(t--){
  34. int u = read(), v = read(), w = read();
  35. if(!num[v]) num[v] = ++tot;
  36. if(!num[w]) num[w] = ++tot;
  37. dis.a[num[v]][num[w]] = dis.a[num[w]][num[v]] = u;
  38. }
  39. n--;
  40. ans = dis;
  41. while(n){
  42. if(n & 1) ans = ans * dis;
  43. dis = dis * dis;
  44. n >>= 1;
  45. }
  46. cout << ans.a[num[s]][num[e]] << endl;
  47. return 0;
  48. }

Poj 3613 Cow Relays (图论)的更多相关文章

  1. poj 3613 Cow Relays

    Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5411   Accepted: 2153 Descri ...

  2. poj 3613 Cow Relays(矩阵的图论意义)

    题解 用一个矩阵来表示一个图的边的存在性,即矩阵C[i,j]=1表示有一条从i到j的有向边C[i,j]=0表示没有从i到j的边.这个矩阵的k次方后C[i,j]就表示有多少条从i到j恰好经过k条边的路径 ...

  3. POJ 3613 Cow Relays(floyd+快速幂)

    http://poj.org/problem?id=3613 题意: 求经过k条路径的最短路径. 思路: 如果看过<矩阵乘法在信息学的应用>这篇论文就会知道 现在我们在邻接矩阵中保存距离, ...

  4. POJ 3613 Cow Relays 恰好n步的最短路径

    http://poj.org/problem?id=3613 题目大意: 有T条路.从s到e走n步,求最短路径. 思路: 看了别人的... 先看一下Floyd的核心思想: edge[i][j]=min ...

  5. POJ 3613 Cow Relays【k边最短路】

    题目链接:http://poj.org/problem?id=3613 题目大意: 给出n头牛,t条有向边,起点以及终点,限制每头牛放在一个点上,(一个点上可以放多头牛),从起点开始进行接力跑到终点, ...

  6. 【floyd+矩阵乘法】POJ 3613 Cow Relays

    Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a rel ...

  7. POJ 3613 Cow Relays (floyd + 矩阵高速幂)

    题目大意: 求刚好经过K条路的最短路 我们知道假设一个矩阵A[i][j] 表示表示 i-j 是否可达 那么 A*A=B  B[i][j]  就表示   i-j 刚好走过两条路的方法数 那么同理 我们把 ...

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

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

  9. POJ 3613 [ Cow Relays ] DP,矩阵乘法

    解题思路 首先考虑最暴力的做法.对于每一步,我们都可以枚举每一条边,然后更新每两点之间经过\(k\)条边的最短路径.但是这样复杂度无法接受,我们考虑优化. 由于点数较少(其实最多只有\(200\)个点 ...

随机推荐

  1. mac下使用VMVARE安装win10虚拟机的一些坑

    最近Mac上安装windows踩到了几个坑: 坑一:启动虚拟机后,提示找不到CD-ROM中找不到对应的ISO文件 硬盘格式请选择 在虚拟机->设置中选择启动磁盘为CD_ROM,然后重新启动. 坑 ...

  2. 【Python源码剖析】对象模型概述

    Python 是一门 面向对象 语言,实现了一个完整的面向对象体系,简洁而优雅. 与其他面向对象编程语言相比, Python 有自己独特的一面. 这让很多开发人员在学习 Python 时,多少有些无所 ...

  3. iOS-Code Data多线程的封装详解

    Code Data 的单例封装:      很容易发现,系统生成的模版代码将Core Data 的基本的准备(貌似还挺复杂!)都放在 AppDelegate中了,可苹果公司为什么会这么做呢?     ...

  4. 学习Redis好一阵了,我对它有了一些新的看法

    前言 本篇文章不是一篇具体的教程,我打算记录一下自己对Redis的一些思考.说来惭愧,我刚接触Redis的时候只是简单地使用了一下,背了一些面试题,就在简历上写下了Redis这个技能点. 我们能在网络 ...

  5. Nginx解决前端调用后端接口跨域问题

    1.项目中遇到的问题描述: 前端调用zuul统一网关服务接口,请求状态码200,但是无返回数据. 浏览器控制台报错信息:No  Access-Control-Allow-Origin header i ...

  6. Vue可响应式数组方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Autoware 标定工具 Calibration Tool Kit 联合标定 Robosense-16 和 ZED 相机!

    一.安装 Autoware & ZED 内参标定 & 外参标定准备 之前的这篇文章:Autoware 进行 Robosense-16 线雷达与 ZED 双目相机联合标定! 记录了我用 ...

  8. PHP源码进行加密(仅linux)

    加密软件(php_screw) 1.下载网站:http://sourceforge.net/projects/php-screw/ 2.描述: php文件通常以文本格式存贮在服务器端, 很容易被别人读 ...

  9. Nice Jquery Validator 自定义规则

    规则定义方式 (1). 正则 适用于使用单个正则能搞定的验证. // 使用数组包裹正则和错误消息,规则不通过时提示该消息 mobile: [/^1[3458]\d{9}$/, '请检查手机号格式'] ...

  10. Docker学习 ,超全文档!

    我们的口号是:再小的帆也能远航,人生不设限!!        一.学习规划: Docker概述 Docker安装 Docker命令 Docker镜像 镜像命令 容器命令 操作命令 容器数据卷  Doc ...