【Floyd矩阵乘法】BZOJ1706- [usaco2007 Nov]relays 奶牛接力跑
【题目大意】
给出一张无向图,求出恰巧经过n条边的最短路。
【思路】
首先题目中只有100条边,却给出了10000个点(实际上最多只能有200个),离散化一下。
后面就是Floyd的新姿势,以前看过的集训队论文里面有:D
一开始的邻接矩阵是经过一条边的最短路,把这个邻接矩阵记作f[0]
f[1]=f[0]*f[0]=f[0]^2(这里的乘法是矩阵乘法),就可以表示恰巧经过两条边的啦。
f[2]=f[1]*f[0]=f[0]^3,恰巧表示经过两条边。
……
所以恰巧经过n条边的最短路是f[n-1]=f[0]^n。
矩阵快速幂一下就好啦。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXM=+;
const int MAXN=+;
const ll INF=1e16;
struct node
{
ll dis[MAXM][MAXM]; }f,result,origin;
int id[MAXN],cnt;
int n,t,s,e;
node operator * (node a,node b)
{
node c;
for (int i=;i<=cnt;i++)
for (int j=;j<=cnt;j++) c.dis[i][j]=INF;
for (int k=;k<=cnt;k++)
for (int i=;i<=cnt;i++)
for (int j=;j<=cnt;j++)
c.dis[i][j]=min(c.dis[i][j],a.dis[i][k]+b.dis[k][j]);
return c;
} int getnum(int x)
{
if (id[x]==-)
{
id[x]=++cnt;
return(cnt);
}
else return(id[x]);
} void init()
{
memset(id,-,sizeof(id));
cnt=;
scanf("%d%d%d%d",&n,&t,&s,&e);
memset(f.dis,,sizeof(f.dis));
for (int i=;i<=t;i++)
{
int u,v,w;
scanf("%d%d%d",&w,&u,&v);
u=getnum(u);
v=getnum(v);
f.dis[u][v]=f.dis[v][u]=w;
}
for (int i=;i<=cnt;i++)
for (int j=;j<=cnt;j++) if (!f.dis[i][j]) f.dis[i][j]=INF;
} void solve()
{
int k=n-;
result=f,origin=f;
while (k)
{
if (k&) result=result*origin;
k>>=;
origin=origin*origin;
}
printf("%lld",result.dis[id[s]][id[e]]);
} int main()
{
init();
solve();
return ;
}
【Floyd矩阵乘法】BZOJ1706- [usaco2007 Nov]relays 奶牛接力跑的更多相关文章
- bzoj1706 [usaco2007 Nov]relays 奶牛接力跑 矩阵快速幂
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1706 题解 换个方法定义矩阵乘法:先加再取 \(\min\). 对于一个 \(n\times ...
- 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 奶牛接力跑 矩阵乘法
[BZOJ1706][usaco2007 Nov]relays 奶牛接力跑 Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项 ...
- BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德
BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德 Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们 ...
- 【bzoj1706】[usaco2007 Nov]relays 奶牛接力跑 离散化+倍增Floyd
题目描述 FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T <= 100) ...
- bzoj 1706: [usaco2007 Nov]relays 奶牛接力跑——倍增floyd
Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T < ...
- 【bzoj1706】[usaco2007 Nov]relays 奶牛接力跑
题意 给出一张无向图,求出恰巧经过n条边的最短路. 题解 考虑先离散化,那么点的个数只会有202个最多.于是复杂度里面就可以有一个\(n^3\).考虑构造矩阵\(d^1\)表示经过一条边的最短路,那么 ...
- 【BZOJ】1706: [usaco2007 Nov]relays 奶牛接力跑
[题意]给定m条边的无向图,起点s,终点t,要求找出s到t恰好经过n条边的最短路径.n<=10^6,m<=100. [算法]floyd+矩阵快速幂 [题解] 先对点离散化,得到点数N. 对 ...
随机推荐
- 突破XSS字符限制执行任意JS代码
突破XSS字符限制执行任意JS代码 一.综述 有些XSS漏洞由于字符数量有限制而没法有效的利用,只能弹出一个对话框来YY,本文主要讨论如何突破字符数量的限制进行有效的利用,这里对有效利用的定义是可以不 ...
- inspect的使用
# -*- coding: utf-8 -*- # @Time : 2018/9/11 10:29 # @Author : cxa # @File : inspecttest.py # @Softwa ...
- asp.net mvc发送邮件
参考文献: 第一篇:http://www.cnblogs.com/qinpengming/archive/2011/06/08/2075040.html 第二篇:http://www.cnblogs. ...
- 002_Linux-Memory专题
一.单独查看某个进程的内存占用 pmap 736 | tail -n 1 二. 以前我对这块认识很模糊,而且还有错误的认识:今天由我同事提醒,所以我决定来好好的缕缕这块的关系. 图: -------- ...
- Flask:redirect()函数
Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 重定向,就是在客户端提交请求后,本来是访问A页面,结果,后台给了B页面,当然,B页面中才有需要的信息. 在Flask中 ...
- Python_oldboy_自动化运维之路_全栈考试(五)
1.执行 Python 脚本的两种方式 [root@localhost tmp]# cat a.py #!/usr/bin/python # -*- coding: UTF-8 -*- print & ...
- android设备休眠
从上面的连接里面找到了一些资料: 如果一开始就对Android手机的硬件架构有一定的了解,设计出的应用程序通常不会成为待机电池杀手,而要设计出正确的通信机制与通信协议也并不困难.但如果不去了解而盲目设 ...
- dedecms自定义模型之独立模型在首页、列表页、内容调用内容
dedecms关于自定义模型(独立模型)的首页.列表页.内容怎么调用?在后台自定义模型(独立模型)的建立及自定义字段的添加比较简单,需要注意两点: (1)如果某个字段需要在前台列表页显示,则在前台参数 ...
- css同时满足两个类名才有效果的写法
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- XShell安装
Xshell就是一个远程控制Centos的软件:(用XShell比较方便,试用的都知道,界面也人性化) 详细介绍请看 百度百科 下面我们来安装下这个工具: 双击exe 点下一步: 选 免费的 然后下一 ...