【题目大意】

给出一张无向图,求出恰巧经过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 奶牛接力跑的更多相关文章

  1. bzoj1706 [usaco2007 Nov]relays 奶牛接力跑 矩阵快速幂

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1706 题解 换个方法定义矩阵乘法:先加再取 \(\min\). 对于一个 \(n\times ...

  2. bzoj1706: [Usaco2007 Nov]relays 奶牛接力跑 (Floyd+新姿势)

    题目大意:有t(t<=100)条无向边连接两点,求s到e刚好经过n(n<=10^7)条路径的最小距离. 第一反应分层图,但是一看n就懵逼了,不会写.看了题解之后才知道可以这么玩... 首先 ...

  3. [bzoj1706] [usaco2007 Nov]relays 奶牛接力跑

    大概是叫倍增Floyd? 显然最多200个点...f[i][j][k]表示从j到k,走2^i步的最小路程.就随便转移了.. 查询的话就是把n二进制位上是1的那些都并起来. #include<cs ...

  4. 【BZOJ1706】[usaco2007 Nov]relays 奶牛接力跑 矩阵乘法

    [BZOJ1706][usaco2007 Nov]relays 奶牛接力跑 Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项 ...

  5. BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德

    BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德 Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们 ...

  6. 【bzoj1706】[usaco2007 Nov]relays 奶牛接力跑 离散化+倍增Floyd

    题目描述 FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T <= 100) ...

  7. bzoj 1706: [usaco2007 Nov]relays 奶牛接力跑——倍增floyd

    Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T < ...

  8. 【bzoj1706】[usaco2007 Nov]relays 奶牛接力跑

    题意 给出一张无向图,求出恰巧经过n条边的最短路. 题解 考虑先离散化,那么点的个数只会有202个最多.于是复杂度里面就可以有一个\(n^3\).考虑构造矩阵\(d^1\)表示经过一条边的最短路,那么 ...

  9. 【BZOJ】1706: [usaco2007 Nov]relays 奶牛接力跑

    [题意]给定m条边的无向图,起点s,终点t,要求找出s到t恰好经过n条边的最短路径.n<=10^6,m<=100. [算法]floyd+矩阵快速幂 [题解] 先对点离散化,得到点数N. 对 ...

随机推荐

  1. js面向对象编程思想

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. 安卓微信、QQ自带浏览器 UXSS 漏洞

    安卓微信.QQ自带浏览器 UXSS 漏洞 注:PDF报告原文下载链接 Author: hei@knownsec.com Date: 2016-02-29 一.漏洞描述 在安卓平台上的微信及QQ自带浏览 ...

  3. 小白欢乐多——记ssctf的几道题目

    小白欢乐多--记ssctf的几道题目 二哥说过来自乌云,回归乌云.Web400来源于此,应当回归于此,有不足的地方欢迎指出. 0x00 Web200 先不急着提web400,让我们先来看看web200 ...

  4. 使用mysql的SUBSTRING_INDEX函数解决项目中编码非重复问题的实现方案!

    一 SUBSTRING_INDEX函数介绍 作用:按关键字截取字符串 substring_index(str,delim,count) 说明:substring_index(被截取字段,关键字,关键字 ...

  5. 【HASPDOG】Communication error

    靠,防火墙没关,关了防火墙生成文件成功

  6. 解决 Windows 环境 Git Bash 无法识别 Composer 命令的问题

    思路 模拟 Linux,复制一个 composer 文件到 Git Bash 的 /usr 的子目录,并赋予执行权限. 解决 首先,请确定你的 composer.phar 文件路径.我的是: /d/w ...

  7. openjudge-NOI 2.5基本算法之搜索 专题题解目录

    1.1700 八皇后问题 2.1756 八皇后 3.1789 算24

  8. 七、springcloud之配置中心Config(二)之高可用集群

    方案一:传统作法(不推荐) 服务端负载均衡 将所有的Config Server都指向同一个Git仓库,这样所有的配置内容就通过统一的共享文件系统来维护,而客户端在指定Config Server位置时, ...

  9. js事件兼容处理

    js封装事件处理函数,兼容ie,支持事件代理 var eventUtil = { bindEvent: function(el, type, target, callback, popgation) ...

  10. (一) solr的安装与配置

    载solr文件压缩包,并解压 ,要运行solr服务之前需要先安装jdk,具体安装过程可以参看下面这篇文章: http://www.cnblogs.com/xiazh/archive/2012/05/2 ...