【题目大意】

给出一张无向图,求出恰巧经过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. Strusts2笔记8--文件的上传和下载

    文件的和上传和下载: (1)文件的上传: Struts是通过拦截器实现文件上传的,而默认拦截器栈中包含了文件上传拦截器,故表单通过Struts2可直接将文件上传,其底层是通过apache的common ...

  2. 【codeforces】【比赛题解】#920 Educational CF Round 37

    [A]浇花 题意: 一个线段上每个整点都有花,有的点有自动浇花的喷水器,有问几秒能浇完所有的花. 题解: 大模拟 #include<cstdio> #include<cstring& ...

  3. python基础===一行 Python 代码实现并行(转)

    原文:https://medium.com/building-things-on-the-internet/40e9b2b36148 译文:https://segmentfault.com/a/119 ...

  4. 企业日志大数据分析系统ELK+KAFKA实现【转】

    背景: 最近线上上了ELK,但是只用了一台Redis在中间作为消息队列,以减轻前端es集群的压力,Redis的集群解决方案暂时没有接触过,并且Redis作为消息队列并不是它的强项:所以最近将Redis ...

  5. 一步一步搭建oracle 11gR2 rac+dg之database安装(五)【转】

    一步一步在RHEL6.5+VMware Workstation 10上搭建 oracle 11gR2 rac + dg 之database安装 (五)   转自 一步一步搭建oracle 11gR2 ...

  6. html 列表标签

    1.有序列表 <ol> <li>你好</li> <li>你好</li> <li>你好</li> </ol> ...

  7. 【不知道是啥的NOIP模拟赛】网络入侵

    题意是这样的: 给你一棵树,每个边有一个初始的0/1边权.你希望把它弄成一个给定的样子. 你每次可以选一条树链取反,然后问你最少要操作几次. ----------------------------- ...

  8. Linux下配置镜像源

    清华大学地址: https://mirrors.tuna.tsinghua.edu.cn 选择对应ubuntu的版本 在linux下用终端敲 cd /etc/apt/source.list 把里面的内 ...

  9. python网络编程-paramiko

    python基础学习日志day8-paramiko 一:简介 Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 现有这样的需求:需要使用windows客户端,远程连 ...

  10. 组件化表单解决方案AForm 1.3 发布

    v1.3 更新日志 输入控件的实现改为实例化模式,同类型多个输入控件在同一个表单不会冲突 输入控件实现了继承 可以使用AForm.create创建表单,和使用new AForm创建实例的参数和结果一样 ...