题目描述

给出一张无向连通图,求S到E经过k条边的最短路。

输入输出样例

输入样例#1:

2 6 6 4
11 4 6
4 4 8
8 4 9
6 6 8
2 6 9
3 8 9

输出样例#1:

10题解:法1:dp+floyd+倍增f[i][j][p]为从i到j经过2^p条边显然f[i][j][p]=min(f[i][k][p-1]+f[k][j][p-1])如果n不是2的幂也没事,将n进行二进制分解,再用dp转移ans[x][i]=min(ans[!x][j]+f[i][j][p]) n的二进制第p位为1
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 int n,t,s,e,f[201][201][25],ans[2][201],num[1005],pos,logn;
 8 int main()
 9 {int i,d,u,v,p,j,k;
10     cin>>n>>t>>s>>e;
11     memset(f,127/3,sizeof(f));
12     memset(ans,127/2,sizeof(ans));
13     for (i=1;i<=t;i++)
14     {
15         scanf("%d%d%d",&d,&u,&v);
16         if (!num[u]) num[u]=++pos;
17         if (!num[v]) num[v]=++pos;
18         f[num[u]][num[v]][0]=f[num[v]][num[u]][0]=d;
19     }
20      logn=log2(n);
21       for (p=1;p<=logn;p++)
22       {
23             for (k=1;k<=pos;k++)
24             {
25                 for (i=1;i<=pos;i++)
26                 {
27                     for (j=1;j<=pos;j++)
28                     {
29                         f[i][j][p]=min(f[i][j][p],f[i][k][p-1]+f[k][j][p-1]);
30                     }
31                 }
32             }
33       }
34       t=0;p=0;
35       ans[0][num[s]]=0;
36         while (n)
37         {
38             if (n&1)
39             {
40                 t=!t;
41                  for (i=1;i<=pos;i++)
42                  {ans[t][i]=2e9;
43                     for (j=1;j<=pos;j++)
44                     {
45                         ans[t][i]=min(ans[t][i],ans[!t][j]+f[i][j][p]);
46                     }
47                  }
48             }
49             p++;
50             n/=2;
51         }
52     cout<<ans[t][num[e]];
53 }

 

法二:矩阵乘法

可知用邻接矩阵表示时,floyd的过程可以视为矩阵运算,且满足交换律

意思就是先求出走1条边的矩阵,再求出找4条边矩阵

等价于先求出走2条边的矩阵,在求出找3条边矩阵

重载矩阵乘法为floyd的过程,做快速幂就行

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 int n,t,s,e,f[201][201],num[1005],pos;
 8 struct mat
 9 {
10     int s[101][101];
11     mat()
12     {int i,j;
13         for (i=1;i<=pos;i++)
14          for (j=1;j<=pos;j++)
15          s[i][j]=1e9;
16     }
17      mat operator*(const mat &x)
18      {int i,j,k;
19         mat ans;
20         for (k=1;k<=pos;k++)
21         {
22             for (i=1;i<=pos;i++)
23              {
24                 for (j=1;j<=pos;j++)
25                 {
26                     ans.s[i][j]=min(ans.s[i][j],s[i][k]+x.s[k][j]);
27                 }
28              }
29         }
30         return ans;
31      }
32 }S,T;
33 int main()
34 {int i,j,d,u,v;
35     cin>>n>>t>>s>>e;
36     for (i=1;i<=t;i++)
37     {
38         scanf("%d%d%d",&d,&u,&v);
39         if (!num[u]) num[u]=++pos;
40         if (!num[v]) num[v]=++pos;
41         f[num[u]][num[v]]=f[num[v]][num[u]]=d;
42     }
43     mat S,T;
44     for (i=1;i<=pos;i++)
45     for (j=1;j<=pos;j++)
46     if (f[i][j])
47      S.s[i][j]=T.s[i][j]=f[i][j];
48       n--;
49       while (n)
50       {
51             if (n&1)
52             {
53                 S=S*T;
54             }
55             T=T*T;
56             n>>=1;
57       }
58     cout<<S.s[num[s]][num[e]];
59 }

转载于:https://www.cnblogs.com/Y-E-T-I/p/7366430.html

[USACO07NOV]牛继电器Cow Relays相关推荐

  1. [LUOGU] P2886 [USACO07NOV]牛继电器Cow Relays

    https://www.luogu.org/problemnew/show/P2886 给定无向连通图,求经过k条边,s到t的最短路 Floyd形式的矩阵乘法,同样满足结合律,所以可以进行快速幂. 离 ...

  2. 洛谷 P3014 [USACO11FEB]牛线Cow Line

    P3014 [USACO11FEB]牛线Cow Line 题目背景 征求翻译.如果你能提供翻译或者题意简述,请直接发讨论,感谢你的贡献. 题目描述 The N (1 <= N <= 20) ...

  3. 洛谷 P3111 [USACO14DEC]牛慢跑Cow Jog_Sliver

    P3111 [USACO14DEC]牛慢跑Cow Jog_Sliver 题目描述 The cows are out exercising their hooves again! There are N ...

  4. [USACO07NOV]Cow Relays

    map+floyed+矩阵乘法(倍增floyed) # include <stdio.h> # include <stdlib.h> # include <iostrea ...

  5. 并不对劲的[USACO07NOV,洛谷p2886]Cow Relays

    题意就是给一张无向有边权的图.起点.终点,求起点到终点经过n条边的最短路.n<=10^6,点的编号<=10^3,边数<=10^2. 这个边数让人不由自主地想到了floyd,然后发现f ...

  6. P2901 [USACO08MAR]牛慢跑Cow Jogging

    题目描述  传送门 Bessie has taken heed of the evils of sloth and has decided to get fit by jogging from the ...

  7. Cow Relays POJ - 3613

    这题面是外星人写的吧 定义一个群,其元素为一个矩阵,定义一个该群的元素M,并且M存着一个图. 定义一个二元运算符*,运算结果仍为该群的元素. 如M*M=R,则R(i,j)=Min(Rij,Mik+Mk ...

  8. linux内核通用提权漏洞expliot 脏牛Dirty COW

    0x01 漏洞简介 Linux内核在处理内存写时拷贝(Copy-on-Write)时存在条件竞争漏洞,导致可以破坏私有只读内存映射.一个低权限的本地用户能够利用此漏洞获取其他只读内存映射的写权限,有可 ...

  9. POJ - 3613 Cow Relays(Floyd思想+矩阵快速幂+动态规划)

    题目链接:点击查看 题目大意:给定一张由T(T<=100)条边构成的无向图,点的编号为1~1000,之间的整数,求从起点S到终点E恰好经过N(N<=1e6)条边(可重复经过)的最短路 题目 ...

最新文章

  1. apache集成tomcat,并根据域名进行分发 屏蔽端口显示
  2. python读中文-python读写中文
  3. mysql 5.6 proxy_mysql-5.6+mysql-proxy构建主从复制与读写分离
  4. 动态加入JS及加入CSS
  5. 写好一份数据分析报告的13个要点
  6. java实用教程——组件及事件处理——ActionEvent事件
  7. Maven不会吮吸。 。 。 但是Maven文件会
  8. 引入Vant-UI全部组件的代码 - (备份)
  9. 最近围绕生鲜社区团购的一些事
  10. Spring WebFlux – SpringReact式编程
  11. WebSocket请求过程分析及实现Web聊天室
  12. 30本引进翻译版日本计算机技术书籍推荐
  13. 计算机分区硬盘有写保护,磁盘被写保护怎么解除的教程详解【图解】
  14. WFP之关联上下文数据以及注意事项
  15. LM09丨费雪逆变换反转网格策略
  16. AT32驱动TFT LCD显示示例
  17. 远程删除用户手机照片?拼多多回应
  18. SQL Server 2012 SP1 补丁发布
  19. Android调用返回键
  20. java接口可以被继承吗

热门文章

  1. 理解DOM事件流的三个阶段 - Lxxyx的开发笔记 - SegmentFault 思否
  2. Java --- 基础学习Ⅱ
  3. JavaScript --- 取得鼠标事件的坐标
  4. HTTP协议(3)浏览器的使用之查看源码
  5. Python高级特性:列表生成式
  6. 软工网络15个人阅读作业2——提问题
  7. 电池技术多年没有较大发展,成为移动设备最大制约
  8. 程序包com.sun.istack.internal不存在
  9. scikit-learn点滴
  10. C语言--在终端输入多行信息,找出包含“ould”的行,并打印改行