【bzoj1706】[usaco2007 Nov]relays 奶牛接力跑 离散化+倍增Floyd
题目描述
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条跑道。
输入
* 第1行: 4个用空格隔开的整数:N,T,S,以及E
* 第2..T+1行: 第i+1为3个以空格隔开的整数:length_i,I1_i,以及I2_i, 描述了第i条跑道。
输出
* 第1行: 输出1个正整数,表示起点为S、终点为E,并且恰好经过N条跑道的路 径的最小长度
样例输入
2 6 6 4
11 4 6
4 4 8
8 4 9
6 6 8
2 6 9
3 8 9
样例输出
10
题解
离散化+倍增Floyd
由于标号最大为1000,有用的却最多只有202,所以需要先离散化。
然后就是倍增Floyd的裸题,用dis[i][][]表示经过2^i条边时两点间最短路。
不同于矩阵乘法,这里求的是最短路,所以要按照Floyd的求法来更新矩阵。
预处理出dis数组后判断n的二进制表示方式,并将相应的距离矩阵乘到一起即可。
注意这里的n有点大,数组开小RE了无数次QAQ
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 210
using namespace std;
int x[N] , y[N] , z[N] , a[N] , tot , cnt , val[N * 5];
struct data
{
int v[N][N];
data()
{
memset(v , 0x3f , sizeof(v));
}
data operator*(const data a)const
{
data ret;
int i , j , k;
for(k = 1 ; k <= cnt ; k ++ )
for(i = 1 ; i <= cnt ; i ++ )
for(j = 1 ; j <= cnt ; j ++ )
ret.v[i][j] = min(ret.v[i][j] , v[i][k] + a.v[k][j]);
return ret;
}
}dis[25] , ans;
int main()
{
int n , m , s , e , i;
scanf("%d%d%d%d" , &n , &m , &s , &e);
a[++tot] = s , a[++tot] = e;
for(i = 1 ; i <= m ; i ++ ) scanf("%d%d%d" , &z[i] , &x[i] , &y[i]) , a[++tot] = x[i] , a[++tot] = y[i];
sort(a + 1 , a + tot + 1);
for(i = 1 ; i <= tot ; i ++ )
if(a[i] != a[i - 1])
val[a[i]] = ++cnt;
for(i = 1 ; i <= m ; i ++ ) dis[0].v[val[x[i]]][val[y[i]]] = dis[0].v[val[y[i]]][val[x[i]]] = z[i];
for(i = 1 ; (1 << i) <= n ; i ++ ) dis[i] = dis[i - 1] * dis[i - 1];
for(i = 1 ; i <= cnt ; i ++ ) ans.v[i][i] = 0;
for(i = 0 ; (1 << i) <= n ; i ++ ) if(n & (1 << i)) ans = ans * dis[i];
printf("%d\n" , ans.v[val[s]][val[e]]);
return 0;
}
【bzoj1706】[usaco2007 Nov]relays 奶牛接力跑 离散化+倍增Floyd的更多相关文章
- bzoj1706: [Usaco2007 Nov]relays 奶牛接力跑 (Floyd+新姿势)
		
题目大意:有t(t<=100)条无向边连接两点,求s到e刚好经过n(n<=10^7)条路径的最小距离. 第一反应分层图,但是一看n就懵逼了,不会写.看了题解之后才知道可以这么玩... 首先 ...
 - [bzoj1706] [usaco2007 Nov]relays 奶牛接力跑
		
大概是叫倍增Floyd? 显然最多200个点...f[i][j][k]表示从j到k,走2^i步的最小路程.就随便转移了.. 查询的话就是把n二进制位上是1的那些都并起来. #include<cs ...
 - bzoj1706 [usaco2007 Nov]relays 奶牛接力跑  矩阵快速幂
		
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1706 题解 换个方法定义矩阵乘法:先加再取 \(\min\). 对于一个 \(n\times ...
 - BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德
		
BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德 Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们 ...
 - 【BZOJ1706】[usaco2007 Nov]relays 奶牛接力跑 矩阵乘法
		
[BZOJ1706][usaco2007 Nov]relays 奶牛接力跑 Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项 ...
 - 【bzoj1706】[usaco2007 Nov]relays 奶牛接力跑
		
题意 给出一张无向图,求出恰巧经过n条边的最短路. 题解 考虑先离散化,那么点的个数只会有202个最多.于是复杂度里面就可以有一个\(n^3\).考虑构造矩阵\(d^1\)表示经过一条边的最短路,那么 ...
 - BZOJ 1706: [usaco2007 Nov]relays 奶牛接力跑
		
Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T < ...
 - bzoj 1706: [usaco2007 Nov]relays 奶牛接力跑——倍增floyd
		
Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T < ...
 - 【BZOJ】1706: [usaco2007 Nov]relays 奶牛接力跑
		
[题意]给定m条边的无向图,起点s,终点t,要求找出s到t恰好经过n条边的最短路径.n<=10^6,m<=100. [算法]floyd+矩阵快速幂 [题解] 先对点离散化,得到点数N. 对 ...
 
随机推荐
- 前端小记4——高性能mobile web开发
			
1.高性能CSS3动画 与PC端场景需要相比,移动web端需要考虑的因素也相对复杂,重点考虑:流量.功耗与流畅度.在pc端上考虑更多的是流畅度,而mobile web中需要考虑网络流量的使用和耗电情况 ...
 - 11、SpringBoot------定时任务
			
开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/Springboot/tree/52ef6c0c805913db1e66ed18671c322e ...
 - Ubuntu 16.04安装docker(2018年最新)
			
参考https://blog.csdn.net/bingzhongdehuoyan/article/details/79411479 http://www.cnblogs.com/lighten/p/ ...
 - 基于 win7下虚拟机的 GNSS-SDR安装过程
			
最近在安装 GNSS-SDR软件时,遇到了很多问题,这里回顾了我的安装过程,罗列了所遇到的问题和解决办法.希望后来者不要再踩这些坑了! 首先,在官方文档中看到,GNSS-SDR目前并不支持直接在 Wi ...
 - shell 脚本入门
			
shell script 是一个程序化脚本,使用shell语法跟linux命令完成的一个程序. 注意事项: 文件开头: #!/bin/bash 文本以enter符号作为开始执行该行语句,用跳脱符 \e ...
 - ios 苹果内购订单验证 --- php实现
			
验证函数: function appleVerify($receipt_data,$orderId = 0) { /* * 21000 App Store不能读取你提供的JSON对象 * 21002 ...
 - HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。
			
第一种:无法序列化 DataTable.未设置 DataTable 名称. 第二种: 排除过程如下: 1.用WCF调试状态下的客户端调用ESB的Publish方法调用成功,证明ESB的推送是没有问题的 ...
 - 邮件系统之Postfix与Dovecot
			
电子邮件系统 电子邮件系统基于邮件协议来完成电子邮件的传输,常见的邮件协议有: 简单邮件传输协议(Simple Mail Transfer Protocol,SMTP):用于发送和中转发出的电子邮件, ...
 - TouTiao开源项目 分析笔记13 最后一个订阅号的实现主页面
			
1.实现订阅号的基础类 1.1.本地订阅号的Bean类==>MediaChannelBean public class MediaChannelBean implements Parcelabl ...
 - python面向对象的约束和自定义异常
			
基于人为来约束: 即人为主动抛出异常 class BaseMessage(object): def send(self,x1): """ 必须继承BaseMessage, ...