题目描述

给出一张无向连通图,求S到E经过k条边的最短路。

输入输出样例

输入样例#1:

2 6 6 4
11 4 6
4 4 8
8 4 9
6 6 8
2 6 9
3 8 9
输出样例#1:

10
题解:
法1:dp+floyd+倍增
f[i][j][p]为从i到j经过2^p条边
显然f[i][j][p]=min(f[i][k][p-1]+f[k][j][p-1])
如果n不是2的幂也没事,将n进行二进制分解,再用dp转移
ans[x][i]=min(ans[!x][j]+f[i][j][p]) n的二进制第p位为1
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,t,s,e,f[][][],ans[][],num[],pos,logn;
int main()
{int i,d,u,v,p,j,k;
cin>>n>>t>>s>>e;
memset(f,/,sizeof(f));
memset(ans,/,sizeof(ans));
for (i=;i<=t;i++)
{
scanf("%d%d%d",&d,&u,&v);
if (!num[u]) num[u]=++pos;
if (!num[v]) num[v]=++pos;
f[num[u]][num[v]][]=f[num[v]][num[u]][]=d;
}
logn=log2(n);
for (p=;p<=logn;p++)
{
for (k=;k<=pos;k++)
{
for (i=;i<=pos;i++)
{
for (j=;j<=pos;j++)
{
f[i][j][p]=min(f[i][j][p],f[i][k][p-]+f[k][j][p-]);
}
}
}
}
t=;p=;
ans[][num[s]]=;
while (n)
{
if (n&)
{
t=!t;
for (i=;i<=pos;i++)
{ans[t][i]=2e9;
for (j=;j<=pos;j++)
{
ans[t][i]=min(ans[t][i],ans[!t][j]+f[i][j][p]);
}
}
}
p++;
n/=;
}
cout<<ans[t][num[e]];
}

 

法二:矩阵乘法

可知用邻接矩阵表示时,floyd的过程可以视为矩阵运算,且满足交换律

意思就是先求出走1条边的矩阵,再求出找4条边矩阵

等价于先求出走2条边的矩阵,在求出找3条边矩阵

重载矩阵乘法为floyd的过程,做快速幂就行

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,t,s,e,f[][],num[],pos;
struct mat
{
int s[][];
mat()
{int i,j;
for (i=;i<=pos;i++)
for (j=;j<=pos;j++)
s[i][j]=1e9;
}
mat operator*(const mat &x)
{int i,j,k;
mat ans;
for (k=;k<=pos;k++)
{
for (i=;i<=pos;i++)
{
for (j=;j<=pos;j++)
{
ans.s[i][j]=min(ans.s[i][j],s[i][k]+x.s[k][j]);
}
}
}
return ans;
}
}S,T;
int main()
{int i,j,d,u,v;
cin>>n>>t>>s>>e;
for (i=;i<=t;i++)
{
scanf("%d%d%d",&d,&u,&v);
if (!num[u]) num[u]=++pos;
if (!num[v]) num[v]=++pos;
f[num[u]][num[v]]=f[num[v]][num[u]]=d;
}
mat S,T;
for (i=;i<=pos;i++)
for (j=;j<=pos;j++)
if (f[i][j])
S.s[i][j]=T.s[i][j]=f[i][j];
n--;
while (n)
{
if (n&)
{
S=S*T;
}
T=T*T;
n>>=;
}
cout<<S.s[num[s]][num[e]];
}

[USACO07NOV]牛继电器Cow Relays的更多相关文章

  1. P2886 [USACO07NOV]牛继电器Cow Relays

    题目描述 For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race ...

  2. 洛谷P2886 [USACO07NOV]牛继电器Cow Relays

    题意很简单,给一张图,把基本的求起点到终点最短路改成求经过k条边的最短路. 求最短路常用的算法是dijkstra,SPFA,还有floyd. 考虑floyd的过程: c[i][j]=min(c[i][ ...

  3. Luogu 2886 [USACO07NOV]牛继电器Cow Relays

    BZOJ 1706权限题. 倍增$floyd$. 首先这道题有用的点最多只有$200$个,先离散化. 设$f_{p, i, j}$表示经过$2^p$条边从$i$到$j$的最短路,那么有转移$f_{p, ...

  4. [USACO07NOV]牛继电器Cow Relays (最短路,DP)

    题目链接 Solution 非正解 似乎比较蛇啊,先个一个部分分做法,最短路+\(DP\). 在求最短路的堆或者队列中存储元素 \(dis_{i,j}\) 代表 \(i\) 这个节点,走了 \(j\) ...

  5. [LUOGU] P2886 [USACO07NOV]牛继电器Cow Relays

    https://www.luogu.org/problemnew/show/P2886 给定无向连通图,求经过k条边,s到t的最短路 Floyd形式的矩阵乘法,同样满足结合律,所以可以进行快速幂. 离 ...

  6. [luoguP2886] [USACO07NOV]牛继电器Cow Relays(矩阵)

    传送门 矩阵快速幂,本质是floyd 把 * 改成 + 即可 注意初始化 因为只有100条边,所以可以离散化 #include <cstdio> #include <cstring& ...

  7. 洛谷 P2886 [USACO07NOV]牛继电器Cow Relays

    题面 解题思路 ## floyd+矩阵快速幂,跟GhostCai爷打赌用不用离散化,最后完败..GhostCai真是tql ! 有个巧妙的方法就是将节点重新编号,因为与节点无关. 代码 #includ ...

  8. [洛谷P2886] 牛继电器Cow Relays

    问题描述 For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race ...

  9. 洛谷 [P2886] 牛继电器Cow Relays

    最短路 + 矩阵快速幂 我们可以改进矩阵快速幂,使得它适合本题 用图的邻接矩阵和快速幂实现 注意 dis[i][i] 不能置为 0 #include <iostream> #include ...

随机推荐

  1. NOIP2012 提高组 Day 2

    http://www.cogs.pro/cogs/page/page.php?aid=16 期望得分:100+100+0=0 实际得分:100+20+0=120 T2线段树标记下传出错 T1 同余方程 ...

  2. System V IPC 之信号量

    本文继<System V IPC 之共享内存>之后接着介绍 System V IPC 的信号量编程.在开始正式的内容前让我们先概要的了解一下 Linux 中信号量的分类. 信号量的分类 在 ...

  3. JAVA_SE基础——29.构造函数

    黑马程序员入学Blog... jvm创建Java对象时候需要调用构造器,默认是不带参数的.在构造器中,你可以让jvm帮你初始化一些参数或者执行一系列的动作. 它是对象创建中执行的函数,及第一个被执行的 ...

  4. php的打印sql语句的方法

    echo M()->_sql(); 这样就可以调试当前生成的sql语句: //获取指定天的开始时间和结束时间 $datez="2016-05-12"; $t = strtot ...

  5. Pandas速查手册中文版

    本文翻译自文章: Pandas Cheat Sheet - Python for Data Science ,同时添加了部分注解. 对于数据科学家,无论是数据分析还是数据挖掘来说,Pandas是一个非 ...

  6. maven入门(6)maven的生命周期

    1. 三套生命周期     Maven拥有三套相互独立的生命周期,它们分别为clean,default和site. 每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和 ...

  7. CentOS ping www.baidu.com 报错 name or service not know

    今天尝试安装了centos系统 玩一玩 刚刚装好的操作系统 ping www.baidu.com的时候  报出 name or service not known 查了好多资料,都没有很好的解决 最后 ...

  8. margin-top塌陷

    margin-top 塌陷 在两个不浮动的盒子嵌套时候,内部的盒子设置的margin-top会加到外边的盒子上,导致内部的盒子margin-top设置失败,解决方法如下: 1.外部盒子设置一个边框: ...

  9. 2018年html5入门到精通教程电子书百度云盘下载共22本

    名称 查看 <HTML5启动和运行>(HTML5.Up.and.Running)扫描版[PDF] 下载 <Pro HTML5 Performance>(Pro HTML5 Pe ...

  10. android 加速度传感器 ---摇一摇

    package com.eboy.testyaoyiyao;import java.text.SimpleDateFormat;import java.util.Date;import android ...