【BZOJ1706】[usaco2007 Nov]relays 奶牛接力跑 矩阵乘法
【BZOJ1706】[usaco2007 Nov]relays 奶牛接力跑
Description
FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目。至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T <= 100)条跑道上。 农场上的跑道有一些交汇点,每条跑道都连结了两个不同的交汇点 I1_i和I2_i(1 <= I1_i <= 1,000; 1 <= I2_i <= 1,000)。每个交汇点都是至少两条跑道的端点。 奶牛们知道每条跑道的长度length_i(1 <= length_i <= 1,000),以及每条跑道连结的交汇点的编号 并且,没有哪两个交汇点由两条不同的跑道直接相连。你可以认为这些交汇点和跑道构成了一张图。 为了完成一场接力跑,所有N头奶牛在跑步开始之前都要站在某个交汇点上(有些交汇点上可能站着不只1头奶牛)。当然,她们的站位要保证她们能够将接力棒顺次传递,并且最后持棒的奶牛要停在预设的终点。 你的任务是,写一个程序,计算在接力跑的起点(S)和终点(E)确定的情况下,奶牛们跑步路径可能的最小总长度。显然,这条路径必须恰好经过N条跑道。
Input
* 第1行: 4个用空格隔开的整数:N,T,S,以及E
* 第2..T+1行: 第i+1为3个以空格隔开的整数:length_i,I1_i,以及I2_i, 描述了第i条跑道。
Output
* 第1行: 输出1个正整数,表示起点为S、终点为E,并且恰好经过N条跑道的路 径的最小长度
Sample Input
11 4 6
4 4 8
8 4 9
6 6 8
2 6 9
3 8 9
Sample Output
题解:先根据题意构造出邻接矩阵,然后用邻接矩阵做矩阵乘法。但是本题求的不是方案数,是最短路径,于是我们在矩乘时不是将两个邻接矩阵乘在一起,而是按照Floyd的方法去合并到一起。容易发现Floyd满足结合律,所以这样做是没问题的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include <cstdio> #include <cstring> #include <iostream> using namespace std; typedef struct matrix { int v[210][210]; }M; M x,ans; int tim,m,n,S,T; int ref [1010]; M mmul(M a,M b) { M c; memset(c.v,0x3f, sizeof (c.v)); int i,j,k; for (k=1;k<=n;k++) for (i=1;i<=n;i++) for (j=1;j<=n;j++) c.v[i][j]=min(c.v[i][j],a.v[i][k]+b.v[k][j]); return c; } void pm( int y) { while (y) { if (y&1) ans=mmul(ans,x); x=mmul(x,x),y>>=1; } } int main() { scanf( "%d%d%d%d" ,&tim,&m,&S,&T); int i,a,b,c; memset(x.v,0x3f, sizeof (x.v)); memset(ans.v,0x3f, sizeof (ans.v)); for (i=1;i<=m;i++) { scanf( "%d%d%d" ,&c,&a,&b); if (! ref [a]) ref [a]=++n; if (! ref [b]) ref [b]=++n; x.v[ ref [a]][ ref [b]]=x.v[ ref [b]][ ref [a]]=c; } for (i=1;i<=n;i++) ans.v[i][i]=0; pm(tim); printf( "%d" ,ans.v[ ref [S]][ ref [T]]); return 0; } |
| 欢迎来原网站坐坐! >原文链接<
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架