题目大意:

求刚好经过K条路的最短路

我们知道假设一个矩阵A[i][j] 表示表示 i-j 是否可达

那么 A*A=B  B[i][j]  就表示   i-j 刚好走过两条路的方法数

那么同理

我们把i-j 的路径长度存到A 中。

在A*A的过程中,不断取小的。那么最后得到的也就是i - j 走过两条路的最短路了。

当然也是利用到了floyd的思想。

然后要求出K次的最短路。那么就是矩阵高速幂的工作了。

注意要离散化。用map

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <map>
  6.  
  7. using namespace std;
  8. const int N = 101;
  9. map<int,int>mymap;
  10. struct matrix
  11. {
  12. int a[N][N];
  13. }temp,res,origin;
  14. int n;
  15. matrix mul(matrix x,matrix y)
  16. {
  17. memset(temp.a,0x3f,sizeof temp.a);
  18. for(int i=1;i<=n;i++)
  19. for(int j=1;j<=n;j++)
  20. for(int k=1;k<=n;k++)
  21. temp.a[i][j]=min(temp.a[i][j],x.a[i][k]+y.a[k][j]);
  22.  
  23. return temp;
  24. }
  25.  
  26. matrix matmod(matrix A,int k)
  27. {
  28. memset(res.a,0x3f,sizeof res.a);
  29. for(int i=1;i<=n;i++)res.a[i][i]=0;
  30.  
  31. while(k)
  32. {
  33. if(k&1)res=mul(res,A);
  34. A=mul(A,A);
  35. k>>=1;
  36. }
  37. return res;
  38. }
  39. int main()
  40. {
  41. int k,m,s,e;
  42. while(scanf("%d%d%d%d",&k,&m,&s,&e)!=EOF)
  43. {
  44. memset(origin.a,0x3f,sizeof(origin.a));
  45. mymap.clear();
  46. int num=0;
  47. for(int i=0;i<m;i++)
  48. {
  49. int S,E,LEN;
  50. scanf("%d%d%d",&LEN,&S,&E);
  51. if(!mymap[S])mymap[S]=++num;
  52. if(!mymap[E])mymap[E]=++num;
  53. int l=mymap[S];
  54. int r=mymap[E];
  55. origin.a[l][r]=origin.a[r][l]=LEN;
  56. }
  57. n=num;
  58. matrix ans = matmod(origin,k);
  59. printf("%d\n",ans.a[mymap[s]][mymap[e]]);
  60. }
  61. return 0;
  62. }

POJ 3613 Cow Relays (floyd + 矩阵高速幂)的更多相关文章

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

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

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

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

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

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

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

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

  5. Poj 3613 Cow Relays (图论)

    Poj 3613 Cow Relays (图论) 题目大意 给出一个无向图,T条边,给出N,S,E,求S到E经过N条边的最短路径长度 理论上讲就是给了有n条边限制的最短路 solution 最一开始想 ...

  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 ] DP,矩阵乘法

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

  8. poj 3613 Cow Relays

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

  9. POJ3613 Cow Relays(矩阵快速幂)

    题目大概要求从起点到终点恰好经过k条边的最短路. 离散数学告诉我们邻接矩阵的k次幂就能得出恰好经过k条路的信息,比如POJ2778. 这题也一样,矩阵的幂运算定义成min,而min满足结合律,所以可以 ...

随机推荐

  1. LDAP实战应用指南

    第1章 ladp master服务安装 1.1 安装前系统环境准备 1.1.1 查看系统版本信息 [root@ldap-server ~]# cat /etc/redhat-release CentO ...

  2. TCP/IP模型

    TCP/IP是一组用在实现网络相互连接的通信协议,internet网络体系结构就是以TCP/IP为核心的. TCP/IP分成了四个层次 1.应用层 应用层对应与OSI参考模型的高层,为用户提供了所需要 ...

  3. Storm学习笔记——简介

    1. 简介 流式计算的历史 早在7.8年前诸如UC伯克利.斯坦福等大学就开始了对流式数据处理的研究,但是由于更多的关注于金融行业的业务场景或者互联网流量监控的业务场景,以及当时互联网数据场景的限制,造 ...

  4. JSP JSP(Java Server Page)是一种实现普通静态HTML和动态页面输出混合编码的技术

    JSP JSP(Java Server Page)是一种实现普通静态HTML和动态页面输出混合编码的技术.从这一点来看,非常类似Microsoft ASP.PHP等技术.借助形式上的内容和外观表现的分 ...

  5. Petrozavodsk Summer-2015. Ivan Smirnov Contest 1 B Bloom

    http://opentrains.snarknews.info/~ejudge/team.cgi?contest_id=001463 题目大意:给出$n$个$x$,$m$个$y$,问有多少个hash ...

  6. iOS conformsToProtocol

    - (BOOL)conformsToProtocol:(Protocol *)aProtocol; 是用来检查对象(包括其祖先)是否实现了指定协议类的方法. 今天遇到一个问题,一个类没有实现proto ...

  7. VC++ Debug产生异常时中断程序执行Break on Exception

    It is possible to instruct the debugger to break when an exception occurs, before a handler is invok ...

  8. jQery 操作CSS

    jQuery操作CSS也是很方便的,咱先看看这几个常用的方法: addClass():向一个元素添加一个或者多个类. removeClass():从一个元素中删除一个类或多个类. toggleClas ...

  9. mybatis总结(二)

    实现简单的crud,上一节已经进行最简单的查询 这次在oracle数据库中操作,就在oracle实例中操作,分别是Dept表和Emp表,所以配置文件需要改动. 1.实体类 Dept类 public c ...

  10. c++ 流继承关系